如何在Bitbucket推送后压缩提交?

时间:2016-01-08 09:36:58

标签: git bitbucket sourcetree

我目前正在与另外一个项目合作。问题是我们创建了一个现有项目的分支,并且需要将所有提交从分叉过程之后压缩到Bitbucket上的pull请求的单个提交。

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

以一个仅在master分支中包含少量文件的简单项目为例。

6 个答案:

答案 0 :(得分:5)

找到了已发布答案的精彩摘要。这个更清楚一点: squash pushed commits。 它将需要在创建fork时创建第二个分支。第二个分支可以根据需要推送到远程服务器。

  1. 创建一个将被压扁的新个人分支 #从包含所有提交的现有个人分支开始。
    $ git checkout {ExistingBranchName}
    #创建一个新的个人分支,将被压扁。
    $ git checkout -b {BranchName}

  2. 确定您的个人分支机构与现有CEF分支机构分开的第一次提交 #将{BranchName}替换为您的新分支名称。
    #将“master”替换为适当的CEF分支(例如“2272”,“2171”等)。
    $ git merge-base {BranchName} master

  3. 使用从步骤2返回的提交哈希启动交互式rebase $ git rebase --interactive {hash}
    这将启动一个文本编辑器,其中包含您个人分支中所有提交的列表。看起来应该是这样的:
    选择59d2a23初步实施
    选择752ae4c添加更多功能
    选择cd302a3修复一些东西
    选择5410de3修复别的东西

  4. 将第一行以外的所有内容更改为“壁球”而不是“选择”。内容现在应如下所示:
    选择59d2a23初步实施
    壁球752ae4c添加更多功能
    壁球cd302a3修复一些东西
    壁球5410de3修复别的东西

  5. 保存更改并关闭文件(可以按esc完成,然后输入::wq
    现在将打开一个新文件,其中包含来自所有提交的提交消息。重新提交提交消息,然后保存更改并关闭文件。

  6. 将修改推送到您的个人远程存储库 #如果分支已被推送到远程存储库,则需要添加--force参数。
    git push origin {BranchName} git push origin {BranchName} --force

答案 1 :(得分:4)

有一种更简单的方法。

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

  1. 创建一个包含所有人提交的本地分支。
  2. 在本地分支上执行git登录,以确定第一次分支提交之前的非分支提交的哈希值。
  3. 执行:git reset --soft <hash>
  4. 执行:git commit创建所需的单个提交消息。
  5. 执行:git rebase -i将您的本地分支移动到主服务器端。
  6. 修复任何合并冲突。
  7. git将您的更改推送到用于PR的远程分支。如果已经存在,则使用-f进行强制推送。

答案 2 :(得分:3)

  

...我们创建了一个现有项目的分支,需要将所有提交从分叉过程压缩到单个提交以获取Bitbucket上的pull-request

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

  

有没有办法(最好使用SourceTree,否则使用终端)将已提交的提交压缩到单个提交中?

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

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

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

可能有一种方法可以在SourceTree中完成。

Further reading

答案 3 :(得分:2)

使用private String getRealPathFromURI(Uri contentURI) { String result; Cursor cursor = getContentResolver().query(contentURI, null, null, null, null); if (cursor == null) { // Source is Dropbox or other similar local file path result = contentURI.getPath(); } else { cursor.moveToFirst(); int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); result = cursor.getString(idx); cursor.close(); } return result; }

  

Bitbucket 使用 Git 软件。

     

alex 已经在帖子中说:使用 git rebase 命令!

命令

在终端,命令提示符或cmd:

中使用这些命令
  1. git rebase -i ourbranchname
  2. 编辑程序中的文件将自动打开。
  3. 更改&#34; git rebase -i yourbranchname&#34;的所有提交到&#34; pick&#34;但是一个提交必须有&#34; fixup&#34;!
  4. 保存文件并关闭。
  5. pick
  6. 有用的资源

答案 4 :(得分:2)

使用SourceTree轻松进行重新定位,在sourcetree中选择您基于工作的提交,然后按鼠标右键。

Select the commit in the other branch

然后会弹出一个菜单,选择“交互式改变孩子们的”

这将打开一个屏幕,我们可以在其中选择每次提交的操作。由于我们想要将每个提交压缩在一起,我们点击顶部提交并选择屏幕底部的“使用之前的壁球”按钮。 Sourcetree将更新顶部屏幕以响应您所执行的操作,以便您可以看到它正在执行您想要的操作。

<强>之前:

Before

<强>后:

After

通常,您还希望在将它们压缩在一起时更改提交的消息,双击消息进行更改。如果您已完成更改,请按右下角的“确定”。 Source Tree现在将为您修改历史记录。

完成结果:

Result

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

答案 5 :(得分:1)

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

#!/ bin / sh

#brief:这个脚本应该从你的git仓库中运行。您需要拥有功能分支

#签出了。这将压缩您的功能分支上的所有提交(假设您

#从master分支出来)。然后你可以使用github PR UI合并PR。你需要  运行此脚本时,#feature branch已签出(git checkout feature branch)。

#usage:git-helper-squash-all-commit

#pample:git-helper-squash-all-commits&#34;重新组织目录结构&#34;

set -ex

FINAL_COMMIT_MESSAGE = $ 1

BRANCH_YOU_BRANCHED_FROM =主

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&#34; $ FINAL_COMMIT_MESSAGE&#34;

git push origin $ CURRENT_BRANCH --force