前言
日常开发中一定使用过 git 客户端工具,因为这种客户端工具大大提升了我们操作 git 的效率。本文记录自己使用 SourceTree 工具一些场景。
SourceTree是什么?
SourceTree 是一个 Git 客户端管理工具,适用于 Windows 和 Mac 系统。
commit后的【代码回滚】
回滚使用场景: 是指将改动的代码(commit后的) 提交到了本地仓库,但没有推送(push)到远端仓库的时候。
git命令进行-回滚操作
git要将最近的commit提交 回退到暂存区,可以使用 reset 命令:
            
            
              lua
              
              
            
          
          git log
git reset --soft HEAD~1HEAD~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提交到远程