前言
日常开发中一定使用过 git
客户端工具,因为这种客户端工具大大提升了我们操作 git
的效率。本文记录自己使用 SourceTree
工具一些场景。
SourceTree是什么?
SourceTree 是一个 Git 客户端管理工具,适用于 Windows 和 Mac 系统。
commit后的【代码回滚】
回滚使用场景: 是指将改动的代码(commit后的) 提交到了本地仓库,但没有推送(push)到远端仓库的时候。
git命令进行-回滚操作
git要将最近的commit提交
回退到暂存区,可以使用 reset
命令:
lua
git log
git reset --soft HEAD~1
HEAD~1
表示您要回退到上一个提交(最近的提交)。 如果要回退更多的提交,可以更改 1
为想要回退的提交数。
SourceTree客户端进行-回滚操作
commit代码后,未推送到远程仓库时,发现提交错(如多提交了文件)了,这时候只需要选择本地分支 在历史提交记录中,找到刚提交的节点:右击-代码回滚一下即可。这时本地分支会出现"Revert"字样;
推送按钮会出现提示推送的角标,这时候你可以直接推送一下,注意 此时的推送,远端是不会有变化的!只不过是推送一些日志记录或者其他与代码无关的。
或者也可以提交好正确的代码后,最后再一起推送到远程。
客户端操作:
- 历史(左侧面板)
- 查看提交记录
- 提交回滚
在退回之前(如果已经又修改过本地代码的情况时,建议先把本地未暂存的文件先进行贮存, 因为贮存后本地工作区就变成干净的状态了,然后再进行代码回滚操作)
选择一条要回滚的记录、右键提交回滚

回滚操作后,历史记录会出现一条 带有 Revert
的记录(此时注意观察本地代码会发现,已经变成此次版本的代码了)

特殊情况
就是回滚后发现我们上次一的代码是没有错误的!此时,我们回滚后写的代码就已经没了!!!
而这种情况,就需要再回滚一次 ,第 2 次回滚也就是撤销上一次的回滚操作。这时候本地分支的节点上会出现 Revert Revert
的字样。 有 2 个 Revert
:

客户端的推送按钮也会出现提示:推送的角标。 此时会发现本地代码就已经恢复到我们想要回滚的版本了。
如果有贮藏的代码,此时就可以先取出应用贮藏的代码(有冲突合并),最后将所有代码一起 commit、push提交到远程仓库即可。
push远程仓库后的【代码回滚】(也就是重置到此次提交的操作)
重置(当前分支)到此次提交:是指本地代码已经commit了,并且推送(push)到了远端仓库时的情况。
三种方式:
合并方式 | 说明 |
---|---|
软合并(暂存区) | 软合并:是指将此次提交回滚到指定提交位置,但这个过程中会将修改过的文件暂存到暂存区 |
混合合并(未暂存区) | 混合合并:是指将此次提交回滚到指定的位置,但这个过程中不会将修改过的文件暂存到暂存区,而是将修改过的文件存放在未暂存文件区 |
强行合并 | 强行合并是:指将此次提交回滚到指定的位置,但这个过程中将直接丢弃之前修改的所有文件(因此在选取此种合并时需要考虑清楚,避免一些不必要的麻烦)。 |
场景1
发现推送了错误代码 到远程仓库,又不想重新写好正确代码后进行提交推送,来覆盖错误代码 。
此时就可以使用:重置当前分支到此次提交方式来回滚代码。
SourceTree客户端具体操作:
- 选择刚刚推送分支的节点的前一个或者某个节点
- 右击"重置当前分支到此次提交"
- 选择使用模式
特别注意:
如果在你提交之前,有未拉取的代码,这个时候得注意了,应该拉取远程代码完成后,再进行commit。否则经过上面的操作,会把别人提交的代码回退回去!!!
push代码失败情况
场景1(non-fast-forward 错误)
本地代码修改后进行了 commit
。 此时正打算推送到远程,发现远程库有人比自己早一步提交了代码。
此时尝试拉取远程库,报错:

当使用 Git 推送代码时遇到non-fast-forward
错误,通常是因为:
- 原因 1: 远程分支的更新落后于本地分支
- 原因 2: 远程分支有新的提交未被本地同步
显然上面遇到的问题就是原因 2造成的。
non-fast-forward
错误的核心原因是: 本地分支的最新提交落后于远程分支,即远程仓库有其他人推送了新代码,而你的本地分支没有及时拉取这些更新。直接推送会导致远程分支的历史被覆盖,因此 Git 拒绝了这次推送。
解决方案
1、先拉取再推送
-
拉取远程分支的最新代码
git pull origin develop
这会将远程
develop
分支的更新合并到本地,解决分支历史不一致的问题。 -
如果拉取时出现冲突(可选步骤)
如果拉取过程中出现冲突(Conflict),需要手动解决冲突:
-
打开冲突文件,
-
删除
<<<<<<<
、=======
、>>>>>>>
标记,保留正确的代码。
解决后提交修改:
sqlgit add . git commit -m "解决冲突"
-
-
再次推送代码
perlgit push origin develop
但是此时的情况我们拉取不了代码,也提交了不了代码,所以这种情况方法1 是不行的,需要使用下面方案2。
2、commit代码回滚(推荐)
特别注意:
执行完回滚命令操作后,会发现本地commit提交的代码已经回退了,回到了未提交的状态。此时千万不要直接提交!
解决步骤:
- 回滚commit代码(
git reset --soft HEAD~1
) - 贮藏本地文件(
git stash
) - 拉取远程文件
- 应用贮藏(应用后有冲突进行合并解决)
- push提交到远程