如何存储我以前的提交?

时间:2014-11-12 10:13:37

标签: git

我的git log

出现以下情况
commit 111  <-- need to push it to the repository

commit 222  <-- need to stash this one

...

正如您所看到的,我只需要将最后一次(没有上一次)提交到存储库。

我该怎么办? git revert --soft commit_hash会对我有帮助吗?

7 个答案:

答案 0 :(得分:44)

如果您没有推送任何提交到您的远程存储库,您可以使用交互式基础重新排序&#39;重新排序&#39;您的提交并隐藏(新)最近提交的更改。

假设您已检出当前分支的提示(在您的示例中提交111),请执行以下操作:

git rebase -i HEAD~2

这将打开您的默认编辑器,列出最近的2次提交并为您提供一些说明。对于你在这里所做的事情要非常谨慎,因为你要有效地重写&#39;存储库的历史记录,如果您不小心可能会丢失工作(必要时首先备份整个存储库)。我估计下面的提交哈希/标题是

pick 222 commit to be stashed
pick 111 commit to be pushed to remote

# Rebase 111..222 onto 333
#
# 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
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

重新排序两个提交(它们列为最旧=&gt;最新),如下所示:

pick 111 commit to be pushed to remote
pick 222 commit to be stashed

保存并退出,此时git将进行一些处理以重写您已更改的两个提交。假设没有问题,您应该颠倒两个变更集的顺序。这可以通过git log --pretty=oneline -5确认,它将输出最新的。

此时,您可以在最近的提交中执行软重置,并隐藏您的工作更改:

git reset --soft HEAD~1
git stash

重要的是要提到这个选项只有在您之前没有将任何这些更改推送到您的遥控器时才真正可行,否则会导致每个人使用存储库出现问题。

答案 1 :(得分:4)

如果是我,我会避免任何有风险的修订编辑,而是执行以下操作:

  1. 在提交222的SHA上创建一个新分支,基本上作为书签。

  2. 切换回主分支。在其中,还原提交222。

  3. 推送所有已提交的提交,这将仅提交提交111,因为222已被还原。

  4. 如果需要,可以从步骤#1开始工作。根据需要从主干到它的合并以使其保持最新状态。我不打算藏匿。

  5. 当提交222中的更改进入时,该分支可以合并到主干。

答案 2 :(得分:2)

像往常一样,在 Git 中,有很多方法可以给这只猫剥皮,但是因为我们谈论的是 2 次提交(而不是多次提交),所以在阅读这个问题时想到的最简单的事情是:

git reset --hard HEAD~2 # set branch to point to 2 commits ago (parent of 222)
git cherry-pick 111
git push
git cherry-pick 222

这个问题询问了关于隐藏之前的提交,但我认为在正常情况下你不需要再这样做,因为你已经完成了推送所需提交的目标。所以你会在这里完成并可以继续你的开发。但是如果你仍然想隐藏你的最高提交,你可以继续:

git reset --soft HEAD~1
git stash

注意:这比交互式 rebase 更容易(稍微)是因为只有 2 个提交给cherry pick,并且您可能希望在它们之间进行推送。

答案 3 :(得分:0)

这对我有用;

  1. 签出当前分支的来源提交。
  2. 从此提交中创建新分支。
  3. 结帐新分行。
  4. 将分支与新分支中的存储代码合并。
  5. 在新分支中进行软重置。
  6. 存储目标代码。
  7. 删除新分支。
  8. 我建议使用像SourceTree这样的东西。

答案 4 :(得分:0)

另一种解决方案使用存储空间:

之前:

~/dev/gitpro $git stash list

~/dev/gitpro $git log --oneline -3

* 7049dd5 (HEAD -> master) c111
* 3f1fa3d c222
* 0a0f6c4 c333
  1. git reset head〜1 <---头移回c222;工作仍然包含c111更改
  2. git stash push -m“ commit 111” <---暂存/工作(包含c111更改);分期/工作回滚到修订的标头(包含c222更改)
  3. git reset head〜1 <---头移回c333;工作仍然包含c222更改
  4. git stash push -m“ commit 222” <---暂存/工作(包含c222更改);分期/工作回滚到修订的标头(包含c333项更改)
  5. git stash pop stash @ {1} <---已删除c111更改的最旧的stash条目并应用于登台/工作
  6. git commit -am“ commit 111” <-具有c111更改的新提交变成新的头

注意,如果不指定stash @ {1}条目,则无法运行“ git stash pop”。藏匿区是LIFO堆栈,而不是FIFO,因此会错误地弹出包含c222更改的藏匿区@ {0}条目(而不是包含c111更改的藏匿区{{1})。

注意,如果在提交111和222之间存在冲突的块,那么在尝试弹出时将被迫解决它们。 (如果您还选择了其他的变基解决方案,也会是这种情况。)

之后:

~/dev/gitpro $git stash list

stash@{0}: On master: c222

~/dev/gitpro $git log -2 --oneline

* edbd9e8 (HEAD -> master) c111
* 0a0f6c4 c333

答案 5 :(得分:0)

我解决了这个问题:

删除目标提交

git revert --strategy resolve 222

将提交222保存到补丁文件中

git diff HEAD〜2 HEAD〜1> 222.patch

应用此补丁取消登台

补丁-p1 <222.补丁

推入藏匿处

git隐藏

删除临时文件

rm -f 222.patch

我认为非常简单的策略

答案 6 :(得分:0)

如果您使用的是 vsCode,您可以这样做: enter image description here