【问题标题】:How to copy the last commit as a new commit in Git?如何将最后一次提交复制为 Git 中的新提交?
【发布时间】:2016-06-21 04:25:22
【问题描述】:

我想复制我的最后一次提交,并且我想从复制的提交(最后一次提交)中进行新的提交以推送到远程分支。

我试过这段代码:

git rm -r .
git checkout HEAD~0 .
git commit -m "My new Commit"

但它没有工作。有什么建议吗?

【问题讨论】:

  • 您是要复制您的上一次提交并对其进行更改以创建新的提交,还是要制作您上一次提交的精确副本而不进行任何更改?
  • 您的用例到底是什么?你想发表不同的评论吗?

标签: git


【解决方案1】:

如果您的历史记录是 C-B-A(其中 A 是最新的),则必须更改某些内容才能在 A 之上进行新的提交。您可以使用--allow-empty 标志绕过它,只需执行git commit --allow-empty,您将在A 之上获得一个空提交,但提交会有所不同(因为父级、时间等不同)。

你为什么要这样做?

【讨论】:

  • 那么--allow-empty 选项是什么?
【解决方案2】:

如果你只想复制最后一次提交并在其他分支中将其作为新提交播放,请尝试 git cherry-pick

【讨论】:

    【解决方案3】:

    如果我错了,请纠正我,但我听上去像是在尝试修改上一次提交?例如对最后一次提交进行一些纠正性更改并将其重新推出。

    您可以使用--amend 标志来执行此操作,这将更新您当前分支上的最新提交。然后,您可以通过执行 git push --forcegit push --force-with-lease(在 git 1.8.5 中引入)来推出修改后的提交,以确保在修改提交时不会覆盖任何推出的更改。

    之所以需要强制推送,是因为通过修改最新的提交,您实际上是在将其全部替换,因此您需要强制推送以明确声明您想要摆脱之前的提交。

    示例:

    git commit --amend -a
    git push --force-with-lease
    

    【讨论】:

      【解决方案4】:

      如果您的目的是在推送之前对现有提交进行更改,

      1. 需要在本地进行完全更改并再次提交更改

      2. 这将在您的 git 日志中列出两个提交。

      3. 将这两个提交合并为一个提交并推送。

      要合并两个提交,请按照以下步骤操作

      说你的历史是

      $ git log --pretty=oneline
      a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c
      b76d157d507e819d7511132bdb5a80dd421d854f b
      df239176e1a2ffac927d8b496ea00d5488481db5 a
      

      也就是说,a 是第一次提交,然后是 b,最后是 c。

      运行git rebase --interactive HEAD~2 给你一个编辑器

      pick b76d157 b
      pick a931ac7 c
      
      # Rebase df23917..a931ac7 onto df23917
      #
      # Commands:
      #  p, pick = use commit
      #  r, reword = use commit, but edit the commit message
      #  e, edit = use commit, but stop for amending
      #  s, squash = use commit, but meld into previous commit
      #  f, fixup = like "squash", but discard this commit's log message
      #
      # If you remove a line here THAT COMMIT WILL BE LOST.
      # However, if you remove everything, the rebase will be aborted.
      #
      

      将 b 的选择更改为 squash 将导致您看到的错误,但如果您通过将文本更改为将 c 压缩为 b

      pick b76d157 b
      s a931ac7 c
      and save-quitting your editor, you'll get another editor whose contents are
      
      # This is a combination of 2 commits.
      # The first commit's message is:
      
      b
      
      # This is the 2nd commit message:
      
      c
      When you save and quit, the contents of the edited file become commit message of the new combined commit:
      
      $ git log --pretty=oneline
      18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c
      df239176e1a2ffac927d8b496ea00d5488481db5 a 
      

      【讨论】:

        【解决方案5】:

        您可以使用git log 复制您的最后一次提交。

        git log --oneline -n 1
        

        您通常运行 git push origin <branch name> 将本地更改推送到远程存储库。

        【讨论】:

        • 这不会复制任何东西。它只是显示你的最后一次提交。
        猜你喜欢
        • 2011-02-20
        • 2016-10-24
        • 2011-07-12
        • 2016-11-25
        • 1970-01-01
        • 2016-09-22
        • 1970-01-01
        • 2011-01-21
        • 1970-01-01
        相关资源
        最近更新 更多