重置错误的rebase后,如何删除其他人在我的分支上的提交

16

我在这里陷入了一些Git困境。我需要通过Git技巧使自己摆脱它。

我加入了一个新的团队并创建了一个功能分支:

git checkout -b feature_branch

进行了一些更改,然后提交/推送到该分支上。

git commit -am "Changes"
git push origin feature_branch

有人在我的PR上留下了评论,所以我进行了更改,然后切换到主分支并重新基于我的分支,再次提交/推送到该分支:

// from feature_branch make some changes
git commit -am "New changes"
git checkout master
git checkout feature_branch
git rebase origin/master
git push feature_branch
一旦我这样做了,我就注意到我的 GitHub PR(拉取请求)会捕捉到别人的提交记录。然后有人告诉我,这个新团队的典型方法是从主分支(master)检出并合并回我的分支,而不是变基(rebase)。
现在是非常奇怪的部分——我开始尝试使用“git reset --hard”来处理,并选择了我想要的一个先于其他人提交的提交记录。
一切看起来都很好,但我之后推送(push)了它上去,似乎已经从我的PR中移除了那个其他人的提交记录。
今天早上我查看时,发现有很多其他人的提交记录被捕捉到了。
所以现在我处于这种奇怪的状态。当我查看我的PR时,有近30个提交记录(其中6个来自不同的人)。实际的差异(更改的文件)只有我自己修改的文件,这很好,但是历史记录本身看起来很荒谬。
如何最好地清理这个问题呢?所有东西都建议使用“git rebase”,但是我被建议不要使用变基。
不幸的是,我需要保留这个分支。最好的方法是如何整理并仅保留我的提交记录?直接完全重置然后再挑选修改内容回到分支上吗?
请帮忙 :|
编辑:这里是历史记录的示例:
Commits on Jul 30, 2018
<SOMEONE ELSES>

Commits on Jul 31, 2018
<SOMEONE ELSES>
<MY ORIGINAL COMMIT>
<SOMEONE ELSES>

Commits on Aug 1, 2018
<SOMEONE ELSES>
<MY COMMIT [Merge branch master into my feature branch]>
<MY COMMIT>
<SOMEONE ELSES>
<MY COMMIT>
<MY COMMIT>
<SOMEONE ELSES>
<MY COMMIT>

etc etc
5个回答

7
// from feature_branch make some changes
git commit -am "New changes"
git checkout master
git checkout feature_branch
git rebase origin/master
git push feature_branch

Once I did this, I noticed my PR (on Github) picked up someone elses' commit.

如果你只是在origin/master上进行了rebase,那是不可能的。但是,这个操作序列有点可疑。你从未进行过git fetch,因此无法确定origin/master是否已经更新。如果确实进行了rebase,git push feature_branch应该会失败,因为rebase不能快进。你必须使用git push -f feature_branch。我怀疑你没有展示出所有的命令历史记录,因此可能出现了其他问题。更新分支的正确序列是这样的。
# Update all your remotes
git fetch

# Rebase your branch on top of origin/master
git checkout feature_branch
git rebase origin/master

# Force push the branch
git push -f

幸运的是,在进行变基操作后,您的旧提交不会丢失,只是不再与任何内容相关联。要找到它们,请使用git reflog命令。这将显示每次HEAD(即您当前的检出)更改的时间。

在日志中,寻找类似于以下内容的信息...

081abed HEAD@{8}: rebase finished: returning to refs/heads/feature_branch
081abed HEAD@{9}: rebase: the last commit message from your branch
0a5b366 HEAD@{10}: rebase: another commit message
e9c4d18 HEAD@{11}: rebase: the first commit message from your branch
e6780bf HEAD@{13}: rebase: checkout origin/master
0ee63b1 HEAD@{14}: checkout: moving from master to feature_branch

0ee63b1 将成为你的旧分支尖端。git reset --hard 0ee63b1 这样你就撤销了rebase。


还有一个替代解释:你可能已经针对错误的分支创建了PR,请仔细检查。


1
谢谢!这就是我意识到发生的事情。几天前,有一个CI机器人更新了我的PR并合并了2个分支。这两个分支包含了其他人的提交(总共6个),这就是为什么对我来说很困惑的原因。我简直不敢相信我忽略了这一点,但一旦我点击查看它实际合并了什么,就恍然大悟了。我最终也清理了我的历史记录,并且我喜欢这个提示,以备将来使用(例如,基本上将所有内容重置为该分支上的第一个“干净”提交)。 - bob_cobb

7
你最好的处理方法可能是使用git rebase -i在你分支中已有的之前的变化上进行变基1,然后从编辑器中的更改列表中删除你不想要的更改(仅留下你想要的更改)。 这将重写更改,包括仅你的更改,并使您回到“清洁”状态(相对而言)。
完成后,可以按照您的git流程建议从主分支(或其他地方)进行git merge

1如果您想要清理先前重新定位/合并到您分支中的所有内容,则可能是您最初分支的更改,或者可能是某个更晚的引用点。选择的点越早,则可以清除的内容就越多,但也可能需要做更多的工作。


谢谢提供的信息。根据您的评论,我最终采用了这种方法,但最终没有使用 --force 进行推送,而是先尝试了一种方法。现在我知道了如何在将来使用它 :) - bob_cobb

5

清理这个的最佳方法是什么?一切都建议使用git rebase,然而,我被建议不要使用rebase。

即使团队本身不使用rebase工作流,但它可能是修复未合并分支的更好方法。只要你确定没有其他人在使用,并且你了解到 可能的影响 如果情况不是这样的话。

注意:我假设你的远程命名为origin,并且该分支是在master上创建的。如果不是这种情况,请用适当的名称替换它们。

在任何操作之前,请隐藏所有修改(如果有):

git stash save

并检出到您的分支:

git checkout mybranch

(推荐)使用临时标签将分支备份:

git tag mybranch_bkp_rebase

变基

正如提到的那样, 您可以将分支变基到创建分支的点,并删除与您的分支无关的提交的行。

git rebase -i "$(git merge-base origin/master HEAD)"

这样一来,你的分支中仅剩下创建分支时已经存在的提交和未被删除的行所对应的提交。

(可选) 在确认一切都正常后,你可以将分支变基到当前的master分支:

git rebase origin/master

重置

如果您不想进行变基,您可以将代码库重置到之前的一个已知良好状态。这可以是您自己分支中的某个提交,创建时的提交或当前的主分支

# Pick one
last_known_good_rev=hash_of_last_good_commit
last_known_good_rev="$(git merge-base origin/master HEAD)"
last_known_good_rev='origin/master'

git reset --hard "$last_known_good_rev"

然后使用git log检查可能缺失的提交:

git log --oneline mybranch_bkp_rebase..HEAD

然后 cherry-pick 它们:

git cherry-pick hash1 hash2 hash3

1
我想为此向您提供赏金。非常有用。如果允许的话,我会尝试着这样做。 - bob_cobb
1
看起来我只能悬赏未被采纳的答案。我已经在其他地方帮了你 ;) - bob_cobb

0

如果你在自己的分支上有多个提交记录,你可以尝试将所有提交记录使用rebase和squash合并成最新的提交记录,这样就可以将所有更改放在分支的顶部,从而防止GitHub在你的提交记录之间拉取所有更改。

然后,你可以强制推送已经rebase的分支到远程仓库,这样只有你的新的经过压缩和rebase后的提交记录会被显示。


0

Kelvin的帖子对我非常有用,只是我不得不删除已经被不需要的额外提交污染的远程分支。我还没有足够的积分直接评论或点赞他们的帖子,所以我在这里评论这个小差异。


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - bfontaine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接