我的情况有以下几点git log:
commit 111 <-- need to push it to the repository
commit 222 <-- need to stash this one
...
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我只需要将最后一次(没有上一次)提交到存储库.
我该怎么做?git revert --soft commit_hash会帮助我吗?
小智 50
如果您没有将提交推送到远程存储库,则可以使用交互式重新定位来"重新排序"提交并仅存储(新)最近提交的更改.
假设您有当前分支的提示(在您的示例中提交111)签出,请执行以下操作:
git rebase -i HEAD~2
Run Code Online (Sandbox Code Playgroud)
这将打开您的默认编辑器,列出最近的2次提交并为您提供一些说明.对于你在这里做什么要非常谨慎,因为你要有效地"重写"你的存储库的历史,如果你不小心可能会丢失工作(必要时先备份整个存储库).我估计下面提交哈希/标题
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
Run Code Online (Sandbox Code Playgroud)
重新排序两个提交(它们列出最旧=>最新),如下所示:
pick 111 commit to be pushed to remote
pick 222 commit to be stashed
Run Code Online (Sandbox Code Playgroud)
保存并退出,此时git将进行一些处理以重写您已更改的两个提交.假设没有问题,您应该颠倒两个变更集的顺序.这可以确认git log --pretty=oneline -5哪个将最新输出.
此时,您可以在最近的提交中执行软重置,并隐藏您的工作更改:
git reset --soft HEAD~1
git stash
Run Code Online (Sandbox Code Playgroud)
值得一提的是,如果您之前没有将任何这些更改推送到远程控制器,则此选项才真正可行,否则可能会导致每个人使用存储库出现问题.
如果是我,我将避免进行任何危险的修订编辑,而执行以下操作:
在提交了222的SHA上创建一个新分支,基本上将其作为书签。
切换回主分支。在其中,还原提交222。
推送所有已提交的提交,这将仅推送提交111,因为222已还原。
如果需要,请在步骤1的分支上进行工作。根据需要从主干合并到主干,以使其保持最新状态。我不会为隐藏而烦恼。
当需要提交222中的更改时,可以将该分支合并到中继。
另一种解决方案使用 stash:
前:
~/dev/gitpro $git stash list
~/dev/gitpro $git log --oneline -3
* 7049dd5 (HEAD -> master) c111
* 3f1fa3d c222
* 0a0f6c4 c333
Run Code Online (Sandbox Code Playgroud)
请注意,您不能在不指定 stash@{1} 条目的情况下运行 'git stash pop'。stash 是一个 LIFO 堆栈——不是 FIFO——所以它会错误地弹出带有 c222 更改的 stash@{0} 条目(而不是带有 c111 更改的 stash@{1})。
请注意,如果提交 111 和 222 之间存在冲突块,那么您将在尝试弹出时被迫解决它们。(如果您也使用替代的 rebase 解决方案,就会出现这种情况。)
后:
~/dev/gitpro $git stash list
stash@{0}: On master: c222
~/dev/gitpro $git log -2 --oneline
* edbd9e8 (HEAD -> master) c111
* 0a0f6c4 c333
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
59298 次 |
| 最近记录: |