Git 将更改从";大师;到我的分行

Git 将更改从";大师;到我的分行,git,merge,rebase,pull-request,pull,Git,Merge,Rebase,Pull Request,Pull,我的存储库中的网络图如下所示: M--------------M | ↑ ├-->1---1---1--┘ | └-->2---2 其中:M在master上推式提交,1在branch-1上推式提交,2在branch-2上推式提交 如您所见,来自branch-1的提交被推送、请求“pull request”并合并到master 我在branch-2工作,在我的任务下工作 我需要从主源代码来完成他们 第一个问题:如何将源代码从master传输到我的分支-2 我

我的存储库中的网络图如下所示:

M--------------M
|              ↑
├-->1---1---1--┘
|
└-->2---2
其中:
M
master
上推式提交,
1
branch-1
上推式提交,
2
branch-2
上推式提交

如您所见,来自
branch-1
的提交被推送、请求“pull request”并合并到
master

我在
branch-2
工作,在我的任务下工作

我需要从主源代码来完成他们

第一个问题:如何将源代码从master传输到我的
分支-2

我在考虑:

git fetch origin
git rebase origin/master
或:


第二个问题:如果在
分支2
上推送第二次提交后发生本地更改,并且我希望执行与上面相同的操作,我该怎么办?

您尝试执行的操作最好通过合并或重定基来完成

推和拉只是你想做的事情的附带条件。他们只是确保您的回购协议本地副本与远程上的同步。所有的实际操作都是在本地完成的。如果分支上有本地提交,则将使用它们


若要将master添加到分支中,可以将master重新设置为master,也可以将master合并到分支中。如果您正在处理个人分支,并且您有权强制推送非快进提交,则rebase将使您的历史记录更清晰:

git rebase master
git push -f
另一方面,如果您正在协同工作,或者没有强制推送权限,请使用合并:

git merge master
git push
以上两种操作都假设您在您感兴趣的分支上。在这两种情况下,远程分支不会以任何方式进入操作的第一部分。不同的推送选项只考虑更改后您的远程设备是否可以从本地分支快速转发。

更新-我忘了回答第二个问题


第一个问题

您可以将
master
合并到您的分支中,
rebase
您的分支以稍后在master上提交,或者
cherry pick
引入所需更改的提交。具体操作取决于您(以及您的团队,如果适用)希望使用哪种工作流

merge
的优点是它不重写任何历史记录,也不复制任何提交。在某些方面,这是最简单的操作,但它确实创造了许多人认为是一个更复杂的历史。(什么样的历史“更好”没有一个客观的答案;这取决于你想如何使用历史。)如果你决定合并,你可以做类似的事情

git checkout branch-2
git merge master
这假设您的本地主机是最新的。如果不是,你可以更新它,或者

git fetch
git checkout branch-2
git merge origin/master
默认情况下,
pull
是“
fetch
merge
”的快捷方式,因此您也可以这样做

git checkout branch-2
git pull origin/master
就我个人而言,我通常不会以这种方式使用
pull
;我只在从其上游更新分支时使用它。但这仍然是一个有效的选择

rebase
的优点是,它避免了合并提交,并创建了一些人喜欢的更线性的历史记录,并且通常不需要您保留重复提交(即,它创建提交的副本,但您通常可以在完成后丢弃原始提交)。历史记录并不能反映软件是如何编写的,尤其是它可能包含不干净构建的提交,即使您维护了“干净签入”策略。这是对历史的改写;如果您重新设置基础的分支已与其他人共享(即,它已在任何点推送到原点),则这可能会导致问题[1]

如果你决定做一个重基,你可以说

git rebase master branch-2
与合并一样,您可以首先从上游
获取并更新
,或者根据需要将
替换为
。您还可以将
pull
配置为执行
rebase
而不是
merge`,但这并不被视为“安全”配置,只有在您对所有涉及的操作都非常熟悉的情况下,才应该执行此操作

cherry pick
的优点是它避免了创建合并提交,也避免了任何历史重写。然而,它会创建重复的提交,这也会使历史变得复杂一些。如果您想要的所有更改都在少量提交中引入到
master
,这可能是一个不错的选择。如果您最终要将分支
合并
返回到
主分支
,则可能会增加合并冲突的可能性,尽管这些冲突不太难纠正。如果最终
rebase
分支到
master
,这应该不是问题(因为
rebase
具有防止
cherry pick
引入冲突的特定保护)。如果选择此方法,首先确定需要复制的提交,然后

git checkout branch-2
git cherry-pick <commit>
然后,恢复它们

git stash pop
请注意,这可能会导致合并冲突(因为本地更改可能会影响与添加到分支的提交相同的代码块)。此外,默认情况下,这将取消显示所有本地更改。如果需要将阶段性更改和未阶段性更改分开,可以说

git stash --index pop
但是,如果在
pop
过程中发生合并冲突,则当给定
--index
选项时,该命令将失败。(在这一点上,您可以不使用
--index
选项继续操作,也可以通过更复杂的步骤来应用您的更改。如果需要,我可以使用“更复杂的步骤”。)


[1] 通常,如果要对共享分支进行历史重写,则需要与拥有该分支副本的所有人进行协调。如果您不这样做,那么他们处理错误的自然尝试可能会撤销重写。在分布式回购协议中,人们反对
git stash pop
git stash --index pop