Git 给定起始和结束SHA';s

Git 给定起始和结束SHA';s,git,squash,Git,Squash,我有一个分支机构,大约有20个分支机构 分支上的第一个SHA是bc3c488… 分支上的最后一个SHA是2c2be6… 如何将所有提交合并在一起 我希望在不使用交互式重基的情况下执行此操作,因为有太多的提交 我需要将其用于github Pull请求,其中要求我合并提交 需要在不进行git合并的情况下执行此操作--挤压,因为我需要在本地挤压,而另一个开发人员进行了合并,并希望我在合并之前先进行挤压。交互式重定基可在此处提供帮助 假设您的分支基于上游的主分支。(假设您的上游由“上游”遥控器定义) 这

我有一个分支机构,大约有20个分支机构


分支上的第一个SHA是
bc3c488…

分支上的最后一个SHA是
2c2be6…

如何将所有提交合并在一起

我希望在不使用交互式重基的情况下执行此操作,因为有太多的提交

我需要将其用于github Pull请求,其中要求我合并提交


需要在不进行git合并的情况下执行此操作--挤压,因为我需要在本地挤压,而另一个开发人员进行了合并,并希望我在合并之前先进行挤压。

交互式重定基可在此处提供帮助

假设您的分支基于上游的主分支。(假设您的上游由“上游”遥控器定义)

这样做:

git rebase -i upstream/master
如果您需要更精确,可以用任何SHA替换“上游/主”

    git rebase -i bc3c488
您将被放置在由$editor环境变量定义的编辑器中。将每行的“pick”改为“squash”(简称“s”),最上面的一行除外。这是将所有这些承诺挤压成一个

与其他工作行的任何合并或重设基础一样,可能存在代码冲突。如果出现这种情况,请执行“git status”以查看哪些文件存在冲突,编辑这些文件(冲突将用>符号分隔),然后执行“git rebase--continue”

重新设置replays提交的时间间隔,如果您发现自己一次又一次地修复同一冲突,请记住这一点(也有工具可以帮助您解决这一问题)

然后,您将有机会编辑新压缩提交的提交消息

用-f推送到远程分支(这会重新写入您想要的历史记录,但要小心这一条)


这是一个很好的交互式重基教程:

您可以使用git-rebase中的交互式shell有选择地选择要重基的提交


git rebase-i bc3c488。。。

然后将要挤压的提交更改为挤压而不是拾取


签出

如果第一个SHA是头部,您也可以使用此方法:

git reset --soft $OLD_SHA; git add -A; git commit --amend --no-edit
小心,此命令将更改回购的历史记录

<如果你想压制你的历史中的承诺:

|---* --- 0 --- 1 ---- 2 --- 3 --- * --- * --- * --- HEAD
与本例类似,提交1、2和3


我真的建议使用
rebase-I

分支上的第一个SHA是bc3c488。。。
分支上的最后一个SHA是2c2be6

# non dangerous implementation that creates a new branch.
git checkout 2c2be6
git rebase -i bc3c488~
git checkout -b your_new_squashed_branch
# then squash the commits by replacing the pick with s
提交结束时的tilda(~)表示上一次提交
确保commit bc3c488在交互重基上可见

# dangerous implementation that rewrites history
git checkout -b new_branch_with_rewritten_history
git reset --hard 2c2be6
git rebase -i bc3c488~
# then squash the commits by replacing the pick with s

git reset--soft${FIRST_SHA}
然后进行新的提交将压扁它们。我在某个地方得到了一个较长的答案,但搜索没有找到它。这里的第一个是指一个较旧的提交?第二个是指更新的(最近的)提交?我建议将这个标记为可接受的答案。它具有最详细的信息,并且可能是完成问题中提出的任务的最安全的方式。