git:推进单一提交,重新排序,重复提交

我想推几个单一的提交到一个git remote回购。 我跟着杰夫在这里找到的答案这样做:

我如何推送特定的提交到远程,而不是以前的提交?

我想要提交的提交不在首位,因此我必须先使用rebase重新排序提交,并使用以下指令来执行此操作:

http://gitready.com/advanced/2009/03/20/reorder-commits-with-rebase.html

基本上我做了:

git clone
git commit
git commit
...
git pull
git rebase -i HEAD~3
git push origin <SHA>:master

我犯了这样的错误。 所以我开始深入研究这个问题。 我发现在我的日志中有重复的提交,如果我在重新绑定之后再做一次git pull,例如:

git clone
git commit
git commit
...
git pull
git log --pretty=format:"%h - %an : %s" // log before rebasing
git rebase -i HEAD~3
git pull
git log --pretty=format:"%h - %an : %s" // log after rebasing
git pull 
git log --pretty=format:"%h - %an : %s" // log after rebasing after pulling

所以我发布了这个问题:

git:在本地再次访问之后重复提交

罗杰在那里的回应引发了我这样一个问题:为什么在重新绑定和拉取之后我看到重复的提交?

从上面看,重新绑定之前的日志看起来像:

84e4015 - Me : Local Commit 3
0dbe86a - Me : Local Commit 2
d57ba2a - Me : Merge branch 'master' of remote repository
a86ea35 - Me : Local Commit 1 before reordering
2fc4fe7 - Remote User 2 : Remote Commit 2
b7a8656 - Remote User 1 : Remote Commit 1
8ce80fc - Me : Merge branch 'master' of remote repository

并且重新绑定之后的日志看起来像:

cf1ff7b - Me : Local Commit 3
cd14463 - Me : Local Commit 2
b9d44fb - Me : Local Commit 1 after reordering
9777c56 - Remote User 2 : Remote Commit 2
a2d7d8b - Remote User 1 : Remote Commit 1
8ce80fc - Me : Merge branch 'master' of remote repository

注意原来的2提交2fc4fe7和b7a8656有新的SHA; 9777c56和a2d7d8b。 我相信这是问题的开始。

现在,我做了另一个Git拉日志看起来像这样:

e8e1a85 - Me : Merge branch 'master' of remote repository
cf1ff7b - Me : Local Commit 3
cd14463 - Me : Local Commit 2
b9d44fb - Me : Local Commit 1 after reordering
9777c56 - Remote User 2 : Remote Commit 2
a2d7d8b - Remote User 1 : Remote Commit 1
2fc4fe7 - Remote User 2 : Remote Commit 2 // duplicate 2
b7a8656 - Remote User 1 : Remote Commit 1 // duplicate 1
8ce80fc - Me : Merge branch 'master' of remote repository

请注意,远程提交现在已被复制,并且远程提交的原始SHA 2fc4fe7和b7a8656已返回。

在罗杰的回应中,他表示这看起来像是其他人推动git的错,而且他们正在重新调整已经推动的提交。 但我相信这是我本地重新推送推送提交的错。

这是因为我重新提交了已经推送到远程的提交吗? 如果是这样,我应该怎么做才能避免这种情况? 我需要重新提交我的提交,以便我可以推送一个提交。 我应该使用分支系统来做到这一点吗? 如果是这样,我将如何使用分支来解决这个问题?


简而言之,rebase不会改变提交,1而是复制它们。 Git通常会隐藏原件,但是如果原件包含其他用户共享的原件,那么您(当然是他们)仍然会看到原件。

作为一般规则,您应该仅对自己的私人未发布的提交进行重新设置。 由于没有其他人按照定义拷贝这些拷贝,因此您制作自己的拷贝,然后(通过rebase)将原件隐藏起来并不是一个问题:现在您可以看到您的拷贝而不是原件,并且没有人看到也可以,如果需要的话,你可以继续rebase。 但是,只要您通过push或类似的方式发布提交,就不能再对其进行更改,因为其他人现在拥有包含SHA-1 ID的原始副本,并且稍后他们仍然会提交。

你在这种情况下所做的就是重建(即复制)他们的提交以及你自己的提交。 部分问题源于使用git pull ,这意味着“获取然后合并”,当你想要的是“获取然后重新分配”。 您可以单独执行这些步骤:

git fetch
git rebase

或者使用git pull --rebase

git pull --rebase

它会告诉pull脚本,在执行提取操作后,它应该执行rebase而不是合并。 您也可以配置git自动执行此操作,而不使用--rebase参数

现在的主要问题是你有一个你可能不想要的合并。 如果是这样,你将需要“撤消”合并(与git reset ;请参阅其他stackoverflow帖子)。


1它不能:一个git对象,包括一个提交,是通过它的对象ID来命名的,它是它的内容的密码校验和。 一个提交由其父代ID,树的ID,提交的作者和提交者(名称,电子邮件和时间戳)以及提交消息组成。 如果你改变了其中的任何一个,你会得到一个新的,不同的ID提交。

2你甚至可以配置它使用git pull --rebase=preserve 。 但是,保留整个rebase操作的合并是一个单独的主题(我之前在stackoverflow贴子中已经介绍过)。

链接地址: http://www.djcxy.com/p/8773.html

上一篇: git: Pushing Single Commits, Reordering with rebase, Duplicate Commits

下一篇: git: Duplicate Commits After Local Rebase Followed by Pull