Git:如何压缩分支上的所有提交

use*_*850 241 git version-control

我创建了新的分支master:

git checkout -b testbranch

我做了20次提交.

现在我要压缩那20个提交.我这样做:

git rebase -i HEAD~20

如果我不知道有多少提交怎么办?有什么方法可以做以下事情:

git rebase -i all on this branch

Von*_*onC 295

压缩所有提交的另一种方法是将索引重置为master:

 git checkout yourBranch
 git reset $(git merge-base master yourBranch)
 git add -A
 git commit -m "one commit on yourBranch"
Run Code Online (Sandbox Code Playgroud)

这并不完美,因为它意味着你知道"yourBranch"来自哪个分支.
注意:使用Git找到原始分支并不容易/可能(视觉方式通常是最简单的,如此处所示).


编辑:你需要使用 git push --force


Karlotcha Hoa 在评论中补充道:

对于重置,你可以做到

git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD)) 
Run Code Online (Sandbox Code Playgroud)

[那]自动使用您当前所在的分支.
如果您使用它,您也可以使用别名,因为该命令不依赖于分支名称.

  • 对于重置,您可以执行git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))以自动使用您当前所在的分支。而且,如果使用该名称,则还可以使用别名,因为该命令不依赖于分支名称。 (3认同)
  • 最好结帐以提交`YourBranch`目前的位置.当你执行`reset`时,这将保持`YourBranch`完好无损 (2认同)

Eev*_*vee 94

你正在做的事情很容易出错.做就是了:

git rebase -i master
Run Code Online (Sandbox Code Playgroud)

这将自动仅将您的分支提交修改为当前最新的主数据.

  • 同意这是您最好的解决方案.但请按照[link](https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit)进行操作,因为它可以更好地解释您需要做什么. (13认同)
  • 可能是因为很容易弄错号码? (9认同)
  • 谢谢,我知道了,但为什么我的系统容易出错 (5认同)
  • 除了压缩提交,您可以将分支合并到master,然后将git reset重置为origin / master以取消所有提交。这样,您就可以使用`commit -am“ the whole something!”来提交现有的未暂存代码。 (2认同)
  • @nurettin我认为'reset origin / master'方法确实很糟糕,因为它与直接在master上进行提交相同-没有'merge branch'历史记录,没有拉请求选项。@WaZaA的答案更符合正常的git工作流程,我认为 (2认同)

WaZ*_*ZaA 70

另一种简单的方法:进入原点分支并执行merge --squash.此命令不执行"squased"提交.当你这样做时,将收集yourBranch的所有提交消息.

$ git checkout master
$ git merge --squash yourBranch
$ git commit # all commit messages of yourBranch in one, really useful
 > [status 5007e77] Squashed commit of the following: ...
Run Code Online (Sandbox Code Playgroud)

  • 好的!我首先从“master”创建一个“temp”分支,将“yourBranch”压缩到其中,然后将“temp”合并到“master”中。 (5认同)
  • 真的。我在 http://stackoverflow.com/a/2427520/6309 中提到了 merge --squash 和 rebase -i 之间的区别 (4认同)
  • 如果您不想挤压到父分支,这有效,只需创建并切换到基于父分支的新分支,然后将挤压合并到该分支中。 (4认同)

小智 68

签出要将所有提交压缩到一个提交的分支.让我们说它,feature_branch.

git checkout feature_branch

步骤1:

origin/feature_branch使用本地master分支对您进行软复位(根据您的需要,您也可以使用origin/master重置).这将重置您的所有额外提交feature_branch,但不会在本地更改任何文件更改.

git reset --soft master

第2步:

将git repo目录中的所有更改添加到将要创建的新提交中.并使用消息提交相同的内容.

git add -A && git commit -m "commit message goes here"

  • 这对我来说是最可靠的解决方案 - 不会导致任何变基错误或合并冲突。 (18认同)
  • 警告: git add -A 将本地文件夹中的所有内容添加到分支。 (11认同)
  • @BhimashankarMantur,如果你用“--force”推送到现有分支,你就可以让它工作 - 因为这个“git重置--soft”正在重写历史。但是当然,您应该仅使用“--force”推送到仅供您使用的分支(而不是共享的分支),除非您通知所有使用此类分支的人有关您的强制推送(这样他们就可以正确地检索这些更改,例如使用:“git pull --rebase origin my-branch-name”) (5认同)
  • 菜鸟的最佳解决方案 - 非破坏性且唯一的 oops 时刻可能会检查太多,例如应用程序机密等,如果您有适当的 gitignore 文件,这无关紧要 (3认同)
  • 非常好的解决方案。由于我已经上传了我的更改,因此我需要强制推送“git push -f”,但效果很好。感谢分享。 (2认同)

Alo*_*thi 37

解决方案 - 1

\n

A. 将 master 拉入您的功能分支(确保更新您的 Master)

\n
git pull origin master  \n
Run Code Online (Sandbox Code Playgroud)\n

B. 软复位到主机

\n
git reset --soft master\n
Run Code Online (Sandbox Code Playgroud)\n

C. 提交您的更改

\n
git commit -m \xe2\x80\x9ccommit message"\n
Run Code Online (Sandbox Code Playgroud)\n

D. 进行 git 推送

\n
git push --force  \n
Run Code Online (Sandbox Code Playgroud)\n

解决方案 - 2

\n

使用 git rebase 压缩提交

\n

A。

\n
$git rebase -i HEAD~3  (HEAD~<no. of commits you want to squash>)\n
Run Code Online (Sandbox Code Playgroud)\n

B.您将收到一个交互式提示,您需要选择顶部提交并在要合并/压缩的提交前面插入“squash”或“s” 。

\n

注意:确保在插入模式下进行更改并保存文件;(VI 编辑器中的 wq)

\n

C.现在您将看到另一个交互式提示,您需要将 # 放在您不想要的提交消息前面,或者添加您自己的消息。再次保存文件,您的提交将成功变基。

\n

干杯!

\n


mle*_*les 26

假设您是从主服务器分支的,则无需yourBranch始终进入重置步骤:

git checkout yourBranch
git reset --soft HEAD~$(git rev-list --count HEAD ^master)
git add -A
git commit -m "one commit on yourBranch"
Run Code Online (Sandbox Code Playgroud)

说明:

  • git rev-list --count HEAD ^master自从你从master,f.ex中创建了你的特征分支以来对提交进行了计数.20.
  • git reset --soft HEAD~20将对最近20次提交进行软复位.这会在文件中留下您的更改,但会删除提交.

用法:

在我的.bash_profile中,我添加了一个别名,gisquash用一个命令执行此操作:

# squash all commits into one
alias gisquash='git reset --soft HEAD~$(git rev-list --count HEAD ^master)'
Run Code Online (Sandbox Code Playgroud)

重置和提交后你需要做一个git push --force.

提示:

如果您正在使用Gitlab> = 11.0,则不再需要这样做,因为它在合并分支时具有 压缩选项. Gitlab Squashing选项


Cav*_*man 19

如何

您需要获取分支的合并基础

git merge-base master your-branch
# 566f8438e0cd0e331ceb49a9cb0920143dfb065c
Run Code Online (Sandbox Code Playgroud)

然后你可以重新设置它

git rebase -i 566f8438e0cd0e331ceb49a9cb0920143dfb065c
# then squash/pick/do commit messages
Run Code Online (Sandbox Code Playgroud)

或者只是进行软重置并提交所有内容

git reset --soft 566f8438e0cd0e331ceb49a9cb0920143dfb065c
git add .
git commit -m "The only commit"
Run Code Online (Sandbox Code Playgroud)

自动化

如果您经常这样做,您可以通过将它们放入您的.bashrc使用中来实现自动化。

g-rebase-branch() {
  git branch --show-current | xargs git merge-base master | xargs git rebase -i
}

g-one-commit() {
  local last_commit_message=`git show -s --format=%s`
  git branch --show-current | xargs git merge-base master | xargs git reset --soft
  git add -A
  git commit -m "$last_commit_message"
  git commit --amend
}
Run Code Online (Sandbox Code Playgroud)

然后直接在终端中执行这些操作。

g-one-commit
Run Code Online (Sandbox Code Playgroud)

但是如果您要合并与 master 不同的分支,那么您可以替换master"$1"来执行此操作

g-one-commit staging
Run Code Online (Sandbox Code Playgroud)


see*_*ebi 17

由于我在这里提出的解决方案遇到了一些麻烦,我想分享一个非常简单的解决方案(无论如何它确实有效):

git merge origin/master && git reset --soft origin/master
Run Code Online (Sandbox Code Playgroud)

前面的合并 cmd 确保在提交时不会发生来自 master 的最近更改(倒置)!之后,只需提交更改并执行git push -f


Tra*_*der 14

基于阅读几个关于压缩的Stackoverflow问题和答案,我认为这是一个很好的一个班轮来压缩分支上的所有提交:

git reset --soft $(git merge-base master YOUR_BRANCH) && git commit -am "YOUR COMMIT MESSAGE" && git rebase -i master
Run Code Online (Sandbox Code Playgroud)

这是假设master是基本分支.

  • 非常感谢,公司有很多限制,并且无法以通常的方式使用编辑器进行重新设置,因为无法大声保存。也不能在 git 中使用壁球和合并功能,因为这个分支去领导开发人员进行合并,他不喜欢它。这 1 个班轮工作并避免了头痛。好工作。 (2认同)

Ric*_*aca 12

要稍微完善穴居人的答案git reset --soft <commit>,请使用. 从文档来看,这个命令:

根本不触及索引文件或工作树(但将头重置为 <commit>,就像所有模式一样)。git status正如所说的那样,这将使所有更改的文件“要提交的更改” 。

换句话说,它会撤消您迄今为止的所有提交<commit>。但它不会更改工作目录。您最终会得到所有未上演且未提交的更改。就好像那些干预提交从未发生过。

例子:

# on master
git checkout -b testbranch
# make many commits
git reset --soft master
git add .
git commit -m 'The only commit.'
Run Code Online (Sandbox Code Playgroud)

此时,您仍在testbranch,它有一个提交。像平常一样合并到 master 中。

Caveman 答案的第一部分(git rebase -i)并没有在我手中压制提交。


Dom*_*omi 12

在之前的回答中,我没有看到任何关于如何处理“杂乱分支”和“自我冲突”的信息。master例如,我经常最终在我的功能分支(称为)上进行提交feature,这会导致自身冲突。我发现这是最烦人的问题之一。

如何压扁杂乱的树枝?使用临时分支!

我发现Felix Rieseberg 的解决方案是最好的。这是我对他的建议的简短转录:

  1. 创建本地tmpoff分支master
    • git checkout master && git pull && git checkout -b tmp
  2. 将所有feature更改合并到tmp(没有任何提交,仅暂存文件更改)。
    • git merge --squash $feature
  3. 手动解决所有剩余的“实际冲突”
    • (这是唯一无法让脚本为您完成的步骤)
  4. 犯罪。tmp现在是master+ 1 次提交(包含所有更改)。
    • git commit ...
  5. 结帐featuregit reset --hard tmpfeature原来的内容没有了,现在基本是了tmp,只是改名了)
    • git checkout $feature && git reset --hard tmp
  6. 忽略并覆盖origin/feature(然后清理)
    • git push -f && git branch -D tmp

Felix 指出,这将产生尽可能干净的合并,而不会因 和 之间混乱/复杂的关系而产生任何奇怪的自我master冲突feature

您可能会遇到少量不可避免的合并冲突。请相信这是尽可能少的冲突数量,因为您跳过了最初创建的许多中间提交。


Edu*_*sov 8

如果您使用基于JetBrains的 IDE,如IntelliJ Idea并在命令行上使用 GUI:

  1. 转到版本控制窗口(Alt + 9/Command + 9)-“日志”选项卡。
  2. 在树中选择您创建分支的点
  3. 右键单击它 -> 将当前分支重置到此处 -> Pick Soft (!!!)(重要的是不要丢失您的更改)
  4. 按下对话窗口底部的重置按钮。

就是这样。您未提交所有更改。现在,如果您进行新的提交,它将被压缩

  • 最佳答案如果您使用Android Studio,PS右键单击并重置的分支是您的本地分支,此外,再次重新提交时,请选中提交按钮旁边的“修改提交”复选框,以确保您没有多次提交。 (2认同)

小智 8

您可以使用子命令来完成此操作,即

$ git rebase -i HEAD~$(git rev-list --count HEAD ^master)

这将首先计算自从您偏离 master 以来的提交,然后重新调整回确切的长度。


Raj*_*ani 6

假设您位于功能分支上:

  1. 找到功能分支中的第一个提交。如果您使用 gitlab 或 github,则可以直接在分支中查看它并从那里复制哈希,或者您可以使用以下命令:

git log <source_branch>..<feature_branch> --pretty=format:%h

  1. 执行以下命令:
git reset --soft <base_commit_hash>

git commit --amend --no-edit
Run Code Online (Sandbox Code Playgroud)

现在,在这个阶段,在您的本地,您有 1 次提交,其中包括所有先前提交中完成的更改。

回顾一下,需要强推一下。强制推送后,所有更改将合并到一次提交中,并且您的分支将只有 1 次提交。

  1. 强制推送功能分支
git push --force 
Run Code Online (Sandbox Code Playgroud)


Mar*_*zak 5

针对喜欢点击的人的解决方案:

  1. 安装sourcetree(免费)

  2. 检查您的提交外观。您最有可能与此相似 在此处输入图片说明

  3. 右键单击提交。在我们的例子中是master分支。

在此处输入图片说明

  1. 您可以通过单击一个按钮来压缩提交。在我们的情况下,我们必须单击2次。您还可以更改提交消息 在此处输入图片说明

  2. 结果很棒,我们随时准备推动! 在此处输入图片说明

旁注:如果要将部分提交推送到远程,则必须在压扁后使用强制推送


归档时间:

查看次数:

132306 次

最近记录:

5 年,11 月 前