当我提交并推送我的更改时,它会导致另一个checkin合并之前提交的其他人。例如,我更改了一个文件Readme.txt
并提交它,然后执行git pull。某些更改将添加到我的存储库中。然后我推动我的改变。有一个额外的签到说:
Merge branch 'mainline' of https://example.com into mainline
如何避免这种情况,只检查我的更改?看起来这是一个重复的签到,其他人签到了。
答案 0 :(得分:3)
您所描述的内容称为 merge-commit 。
This是一个非常好的阅读页面:
Git不是只向前移动分支指针,而是创建一个新的 由此三向合并自动生成的快照 创建一个指向它的新提交。这被称为a 合并提交,并且特别之处在于它有多个父级。
merge-commit 是一个提交,它汇集了两行工作,这意味着它有两个父提交,一个用于当前工作,另一个用于合并的另一端。
要避免这些提交,您可以使用 rebase 等工具在您合并的代码之上重新播放提交。这是一个复杂的主题,因此我建议您遵循一些{ {3}}首先考虑你的方向,以及一些潜在的陷阱。
rebase tutorials是一篇关于避免合并提交的文章。
答案 1 :(得分:1)
当您通过中央存储库与他人合作时,您所看到的是正常的常见现象,不应被视为问题。这是一种处理事实的方式,即有人在您有机会推动提交之前推送了一个提交。这只是时间上的意外。
答案 2 :(得分:0)
假设你所做的事与你所做的事之间没有冲突,通常的解决办法就是使用拉动变换:
git pull --rebase
这将做的是:
最终结果就好像你已经做了git pull
,神奇地完成了所有的更改,然后提交了它们。
如果您的本地提交与传入的提交之间存在冲突,您仍然必须执行通常的合并冲突解决方案。但如果没有,这通常会导致更清晰的历史记录和更少的合并提交。
假设您从提交A
开始并进行本地提交B
:
A --- B
同时,从A
开始的另一位开发者添加了C
,D
和E
:
A --- C --- D --- E
当你拉动时,会发生什么是合并两个不同的分支。最终得到最终状态F
:
A --- C --- D --- E --- F
\--- B ---------------/
如果您使用git pull --rebase
,它将获得远程提交,然后在之后附加您的本地提交。所以你最终会得到这个,而且没有合并提交。
A --- C --- D --- E ---- B
(同样,假设没有发生合并冲突。)
答案 3 :(得分:0)
快进合并可以避免这种合并提交。如果分支A和分支B的最后一次公共提交是分支A的最后一次提交但不是分支B的最后一次提交,则将B合并到A是快进合并。也就是说,A提交的序列是 B提交序列的真实子集。让我们看看这些案例。每个号码都是一个提交。
git merge --no-ff
总是进行非快进合并。 git merge --ff-only
总是会失败,如果它不是快速合并的话。
您可以使用git rebase
,git reset --hard
和git cherry-pick
将您的2个分支分配到案例2中的内容。