11

我目前正在与多个其他人一起开展一个项目。问题是我们创建了一个现有项目的分支,并且需要将分支过程之后的所有提交压缩为Bitbucket上的拉取请求的单个提交。

有什么方法(最好使用SourceTree,否则使用终端)将已推送的提交压缩为单个提交,这样 Bitbucket 中所有提交的历史记录也只是一个提交加上在我们分叉项目之前已经存在的提交?

以一个简单的项目为例,其中只有一个master分支中的几个文件。

4

6 回答 6

11

找到已发布答案的一个很好的摘要。这个更清楚一点: squash push commits。它需要在创建分叉时创建第二个分支。第二个分支可以根据需要向远程服务器推送尽可能多的内容。

  1. 创建一个将被压缩的新个人分支。

    # Start with the existing personal branch that contains all of your commits.
    $ git checkout {ExistingBranchName}
    # Create a new personal branch that will be squashed.
    $ git checkout -b {BranchName}
    
  2. 确定您的个人分支与现有 CEF 分支不同的第一个提交。

    # Replace {BranchName} with your new branch name.
    # Replace "master" with a different CEF branch as appropriate
    # (e.g. "2272", "2171", etc).
    $ git merge-base {BranchName} master
    
  3. 使用从第 2 步返回的提交哈希启动交互式变基。

    $ git rebase --interactive {hash}
    

    这将启动一个文本编辑器,其中包含您个人分支中所有提交的列表。它应该看起来像这样:

    pick 59d2a23 Initial implementation
    pick 752ae4c Add more features
    pick cd302a3 Fix something
    pick 5410de3 Fix something else
    
  4. 将除第一行之外的所有内容更改为说squash而不是pick. 内容现在应如下所示:

    pick 59d2a23 Initial implementation
    squash 752ae4c Add more features
    squash cd302a3 Fix something
    squash 5410de3 Fix something else
    
  5. 保存更改并关闭文件(可以通过按下esc并键入::wq.

    现在将打开一个新文件,其中包含来自所有提交的提交消息。改写提交消息,然后保存更改并关闭文件。

  6. 将修改推送到您的个人远程存储库。

    # If the branch has already been pushed to the remote repository
    # you will need to add the  `--force` argument.
    git push origin {BranchName}
    # or git push origin {BranchName} --force
    
于 2016-01-19T16:14:56.427 回答
5

有一个更简单的方法。

如果您绝对确定没有人会使用该特定分支,您可以执行以下操作:

  1. 创建一个包含每个人的提交的本地分支。
  2. 在本地分支上执行 git log 以确定第一个分支提交之前的非分支提交的哈希值。
  3. 做: git reset --soft <hash>
  4. 做: git commit 创建您想要的单个提交消息。
  5. 做:git rebase -i将您的本地分支移动到master的尖端。
  6. 修复任何合并冲突。
  7. git 将您的更改推送到用于 PR 的远程分支。如果已经存在,请使用 -f 强制推送。
于 2016-10-20T16:39:46.083 回答
4

使用git rebase

Bitbucket使用Git软件。

亚历克斯在他的帖子中已经说过:使用git rebase -i ourbranchname命令!


命令

在终端、命令提示符或 cmd 中使用这些命令:

  1. git rebase -i yourbranchname
  2. 编辑器程序中的文件将自动打开。
  3. 将所有提交从“ pick”更改为“ fixup”,但一个提交必须有“ pick”!
  4. 保存文件并关闭。
  5. git push -f origin yourbranchname

有用的资源

于 2016-01-08T09:43:44.683 回答
4

使用 SourceTree 很容易进行变基,在 sourcetree 中选择您的工作所基于的提交,然后按鼠标右键。

选择另一个分支中的提交

然后会弹出一个菜单,选择“interactively rebase children of”

这将打开一个屏幕,我们可以在其中选择每次提交要做什么。由于我们想将每个提交压缩在一起,因此我们单击顶部提交并选择屏幕底部的“Squash with previous”按钮。Sourcetree 将更新顶部屏幕以响应您所做的操作,以便您可以看到它正在做您想做的事情。

前:

前

后:

后

通常,当您将它们压缩在一起时,您还想更改提交的消息,双击消息进行更改。如果您已完成更改,请按右下角的“确定”。源树现在将为您重新设置历史记录。

完成结果:

结果

现在您可以强制将您的分支推送到您自己的另一个项目的分支并尝试发出另一个拉取请求。

于 2016-01-08T10:37:27.023 回答
2

...我们创建了一个现有项目的分支,并且需要将分支过程之后的所有提交压缩为 Bitbucket 上的拉取请求的单个提交

请注意,拉取请求不需要单个提交。一堆提交可以构成一个拉取请求。

有什么方法(最好使用 SourceTree,否则使用终端)将已推送的提交压缩为单个提交?

是的,您可以使用交互式变基git rebase -i

然后,您可以标记要压缩的提交(按照编辑器中显示的屏幕说明进行操作),然后在完成后编写新的提交消息(git rebase --continue在每次提交后使用)。

如果您已经推送它们,则需要使用该-f选项强制推送。请注意,这是不受欢迎的,因为其他任何已取消这些更改的人都必须跳过箍,以重新与历史同步。

在 SourceTree 中可能有一种方法可以做到这一点。

进一步阅读

于 2016-01-08T09:39:38.370 回答
2

您可以使用此脚本来压缩当前分支的所有提交和最终提交消息。

 #!/bin/sh 

 # brief: This script should be run from within your git repo. You need to have   your feature branch

 # checked out. This will squash all the commits on your feature branch (assuming you 

 # branched from master). Then you can just use the github PR UI to merge the PR in. You need to have 
 # feature branch checked out when you run this script (git checkout feature branch).

 # usage: git-helper-squash-all-commits <final commit messsage ex: "reorganizing directory structure"

 # example: git-helper-squash-all-commits "reorganizing directory structure"

 set -ex

 FINAL_COMMIT_MESSAGE=$1

 BRANCH_YOU_BRANCHED_FROM=master

 CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD`

 COMMIT_HASH=`git merge-base HEAD $BRANCH_YOU_BRANCHED_FROM`

 git reset --soft $COMMIT_HASH

 git commit -am "$FINAL_COMMIT_MESSAGE"

 git push origin $CURRENT_BRANCH --force
于 2017-03-01T06:46:58.170 回答