我在这里陷入了git-funk的困境。我需要自己动手做。
我加入了一个新团队,并创建了一个功能分支:
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
执行完此操作后,我注意到我的PR(在Github上)拾取了其他人的提交。然后我被告知,这个新团队中的典型方法是结帐以掌握并合并到我的分支机构INSTEAD中。
这是现在的时髦部分-我开始和git reset --hard
混为一谈,并从其他人那里选择了我想要的提交。
一切都很好,或者我想。然后我把它推高了,似乎已经从我的PR中删除了其他人的承诺。
我今天早上检查了一下,现在还有很多其他人提交的其他提交。
所以现在我处于这种奇怪的状态。我看一下我的PR,几乎有30个提交(其中6个来自不同的人)。实际的差异(文件已更改)只是我触摸过的文件,这很好,但是历史记录本身看起来很可笑。
清理此问题的最佳方法是什么?一切都建议使用git rebase
,但是,建议我不要使用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
答案 0 :(得分:5)
您最好清理的东西可能是使用git rebase -i
来基于分支中先前要进行的更改 1 ,然后再删除所有要清理的东西。从编辑器中的更改列表中删除不需要的更改(仅保留所需的更改)。这将重写更改,使其仅包括您的更改,并使您回到“相对”(相对)状态。
完成此操作后,您就可以按照git flow的建议从主服务器(或任何地方)git merge
来
1 可能是您最初想从中分支出来的更改,如果您想清除以前已重新建立基础/合并到分支中的所有内容,或者可能稍后再引用。您选择的点越早,可以清理的东西就越多,但也可能需要做更多的工作。
答案 1 :(得分:2)
// 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
这样做后,我注意到我的PR(在Github上)拾起了别人的提交。
如果您所做的只是基于origin/master
的基础,那应该是不可能的。
但是,此序列有点混乱。您永远不会做git fetch
,因此origin/master
并不是最新的。如果确实发生了变基,则git push feature_branch
应该会失败,因为变基无法快速转发。您将不得不使用git push -f feature_branch
。
我怀疑您没有向我们展示其他信息出了问题。完整的命令历史记录将对您有所帮助。
使用rebase更新分支的正确顺序是这样。
# 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
(即您当前的结帐)更改时,都会显示该信息。
在reflog中,寻找类似这样的东西...
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
,并且您撤消了重新设置基准。
还有另一种解释:您是针对错误的分支进行PR的。仔细检查。
答案 2 :(得分:1)
清理此问题的最佳方法是什么?一切都建议使用 git rebase,但是,建议我不要使用rebase。
即使团队自己没有使用重新编制工作流,也可能是 修复未合并分支的更好方法。只要您确定没有 另一个正在使用 ,并且您知道possible implications 并非如此。
注意:我假设您的遥控器名为起源,并且该分支是 在 master 上创建。如果不是这种情况,只需将它们替换为 合适的。
在进行任何操作之前,请先保存所有修改(如果有的话):
git stash save
然后结帐到您的分支机构:
git checkout mybranch
(推荐)使用临时标签按原样备份分支:
git tag mybranch_bkp_rebase
As mentioned,您可以重新定位到创建分支的位置,然后 删除其提交与您的分支无关的行。
git rebase -i "$(git merge-base origin/master HEAD)"
这样,分支中剩下的唯一提交将是已经提交的 创建分支时在那儿,加上行中的提交 没有被删除。
(可选)在检查完所有内容后,您可以根据基准 当前的主控:
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
答案 3 :(得分:0)
如果您的分支上有多个自己的提交,您可以将所有提交变基并将其压缩到最新提交中,这会将您的所有更改放在分支的尖端,这将停止 GitHub拉取在您提交之间发生的所有更改。
从那里你可以强制将 rebase 的分支推送到远程,它应该只显示你新压缩和 rebase 的提交。