me

Git 回滚与撤销


撤销

git 2.3 版本之后可以使用 restore 来执行 1,2 的操作

# 撤销工作区文件修改, 不包括新建文件
git restore README.md # 一个文件
git restore README.md README2.md # 多个文件
git restore . # 当前全部文件

# 从暂存区回到工作区
git restore --staged README.md

如果想撤销到其中某次 commit

回滚

如果已经使用 git push,推送到远程仓库中。对已经提交到远程仓库的还原操作叫回滚

如果没有其他人推送提交时

git reset --hard HEAD~1
git push origin 本地分支 --force-with-lease

当遇到其他人推送新的提交时(产生冲突),需要使用 git fetch

merge 和 rebase

Warning

例如现有上游分支 master,基于 master 分支拉出来一个开发分支 dev,在 dev 上开发了一段时间后要把 master 分支提交的新内容更新到 dev 分支

此时切换到 dev 分支,使用 git rebase masterdev 分支开发完成了之后,要合并到上游分支 master 上的时候,切换到 master 分支,使用 git merge dev

撤销回退

如果在回退的时候回退过了怎么办

修改提交的历史记录

git 提供了针对一系列修改历史记录的操作

# 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
#  d, drop = remove commit
操作信息
pick使用此提交,保持原样。
reword使用此提交,但编辑提交消息。
edit使用此提交,但停下来让你编辑文件或进行其他操作。
squash将此提交合并到前一个提交中,并将提交消息合并为一条。
fixup类似于 squash,但忽略此提交的提交消息。
exec运行一个命令,将 rest of the line 作为命令参数。
drop删除此提交,从历史记录中完全删除。
break在这里停止(稍后使用 git rebase --continue 继续重新设置基准)
label <label>为当前提交添加一个标签。
reset <label>将 HEAD 重置为标签所指向的提交

压缩提交(squash commits)

squash commits 指将多个提交合并成一个提交。git rebase 进入交互模式(-i),常用的命令

git rebase --interactive | -i HEAD~[N]
# Or
git rebase --interactive | -i commit_hash_start commit_hash_end

使用 commit_hash 进行提交压缩

指定压缩的次数 如 HEAD~3(压缩前三次提交信息)

git rebase -i HEAD~3
# 与压缩提交类似,这里需要改正 edit 或者 e

修改提交信息

修改最后一次提交信息

# 仅修改提交信息
git commit --amend --message="modify message"
# 修改提交信息并提交
git commit -m --amend "modify and commit"

修改其中的某次提交信息

stash

git stash 将工作副本暂时搁置到到一个栈(提交越迟,越早弹出,即索引越小)中,以便切换分支处理其他内容

重新应用搁置栈中的工作副本

清理栈中的内容

查看存储差异 (需要暂存之后才可以比较:git add .)

从 stash 中创建分支

git stash branch <name> stash@{1}