不知何故,我的主分支和我的起源/主分支分道扬镳了。 我不希望它们发散。

我如何看待这些差异并将其合并?


当前回答

为了更直接地回答最初的问题,您可以检查实际冲突的差异:

git diff HEAD..origin/master

并使用此信息来决定是将源的更改拉到本地回购中,还是将本地更改推到源中。

其他回答

Git重置——soft origin/my_remote_tracking_branch

This way you will not loose your local changes

你可以用a来查看它们的区别:

git log HEAD..origin/main

# old repositories
git log HEAD..origin/master

(请参见“如何让git总是从特定的分支中提取?”)

注意:从Git 2.28 (Q3 2020)开始,默认的分支是可配置的,现在(2021+)设置为main,不再是master。 其余的答案反映了最近的习俗。


当你有这样的信息:

“你的分支和‘origin/main’已经分开了,#和分别有1个和1个不同的提交。”

检查是否需要更新原点。 如果origin是最新的,那么当您在本地进行自己的提交时,一些提交已经从另一个repo推送到origin。

... o ---- o ---- A ---- B  origin/main (upstream work)
                   \
                    C  main(your work)

您基于提交A提交C,因为这是您当时从上游获取的最新工作。

但是,在您试图推回原点之前,其他人推了提交B。 发展的历史已经分化成不同的道路。

然后,您可以合并或重新编制数据库。详见Pro Git: Git分支-重基。

使用git merge命令:

$ git merge origin/main

# old repositories
$ git merge origin/master

这告诉Git将来自origin/main的更改集成到您的工作中,并创建一个合并提交。 现在的历史图表是这样的:

... o ---- o ---- A ---- B  origin/main (upstream work)
                   \      \
                    C ---- M  main (your work)

新的合并(commit M)有两个父节点,每个父节点代表一条通向该提交中存储的内容的开发路径。

注意,M背后的历史现在是非线性的。

变基

使用git rebase命令:

$ git rebase origin/main

# old repositories
$ git rebase origin/master

这告诉Git重播提交C(你的工作),就好像你是基于提交B而不是A。 CVS和Subversion用户在提交前更新时,通常会在上游工作的基础上重新构建本地更改。 Git只是在提交和重基步骤之间增加了显式的分隔。

现在的历史图表是这样的:

... o ---- o ---- A ---- B  origin/main (upstream work)
                          \
                           C'  main (your work)

Commit C'是git rebase命令创建的一个新提交。 它与C有两个不同之处:

它有着不同的历史:B而不是a。 它的内容解释了B和C的变化;它与合并示例中的M相同。

请注意,C'背后的历史仍然是线性的。 我们选择(目前)只允许cmake.org/cmake.git中的线性历史。 这种方法保留了以前使用的基于cvs的工作流,并且可以简化转换。 尝试将C'推入我们的存储库将会工作(假设您有权限,并且在您重基时没有人推过)。

git pull命令提供了一种简单的方法来从原点获取并在其上重新设置本地工作:

$ git pull --rebase

这将上面的获取和rebase步骤合并到一个命令中。

我更喜欢更方便、更安全的方式。

# copying your commit(s) to separate branch
git checkout <last_sync_commit>
git checkout -b temp
git cherry-pick <last_local_commit>

git checkout master
git reset --soft HEAD~1 # or how many commits you have only on local machine
git stash               # safer, can be avoided using hard resetting on the above line
git pull
git cherry-pick <last_local_commit>

# deleting temporary branch
git branch -D temp
git pull --rebase origin/master 

是一个在大多数情况下可以帮助您的命令。

编辑:从源/主节点中提取提交,并将您的更改应用于新提取的分支历史记录。

当我试图重设跟踪远程分支的分支的基础时,我发现自己处于这种情况,我试图在master上重设它。在这种情况下,如果您尝试重新建立基础,您很可能会发现您的分支分散了,它可能会造成一个混乱,这不是git nubees!

假设您在my_remote_tracking_branch分支上,这个分支是从master分支出来的

$ git状态 在分支my_remote_tracking_branch上 没有要提交的内容(工作目录清洁)

现在你正试图从主为:

吉特校长

现在就停下来,给自己省点麻烦!相反,使用merge as:

Git 合并大师

是的,您最终会在分支上获得额外的提交。但除非你想要“不发散”的分支,否则这将是一个比重基更流畅的工作流程。有关更详细的解释,请参阅这个博客。

另一方面,如果你的分支只是一个本地分支(即还没有推送到任何远程),你一定要做一个rebase(你的分支在这种情况下不会发散)。

现在,如果你正在阅读这篇文章,因为你已经处于由于这种重基而导致的“发散”场景中,你可以通过使用以下命令回到上一次提交(即在未发散的状态下):

Git重置——hard origin/my_remote_tracking_branch