今天有朋友问了我三个问题:

  • 策划或者美术可能没有commit前先pull的习惯,先commit上去,然后push不上。Git提醒pull,然后报错,一般除了程序,甚至没使用过Git的程序就有点不知所措了。应该要讲下出错时候要stash的问题。
  • 策划pull出错时候, 万一revert,然后push强推,把之前别人提交的东西冲掉了。我们有用过回滚,然后强推上去。可以再讲下怎么强推
  • 怎么stash,怎么stash apply,apply失败后怎么弄。commit的顺序最好也要重点强调下

在篇中我会解答,如果还有其他问题 请给我留言,我会追加叙述。求关注 求转发。把爱传出去 笑~

在解答第一个问题之前我们先了解一下什么是 stash (存储) (非程序人员跳过此条说明)

What does “commit your changes or stash them” mean?

stash意味着你有未提交的更改,将会在拉取代码的时候防止本地的修改被覆盖。顺便说一句如果你想知道更多关于Git stash 的问题只需要提问:how do I solve the problem where Git tells me to commit or stash (如何解决Git告诉我commit或stash的问题)

通过git stash将工作区恢复到上次提交的内容,同时备份本地所做的修改,之后就可以正常git pull了,git pull完成后,执行git stash pop将之前本地做的修改应用到当前工作区。

git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。

Pull 与 Fetch 区别 (基本概念)

  1. 每次commit都会有一个记录。
  2. 本地的所有commit在没有push之前,都是存在本地。别人是更新不到你的commit记录的。
  3. 所谓更新就是拿到别人的Commit数据。
  4. 如果你更新到别人的commit里也有你本次commit修改的数据 就会产生冲突,就需要合并。
  5. Pull 的意思是 下载比自己更新的commit数据,并且开始合并,可能马上就有从冲突文件。
  6. Fetch 的意思是 下载比自己更新的commit数据,放在那里(不合并到当前commit),可以看看是否有必要更新到最近commit。

先解释下报错信息

你本地的修改和Git存储上的冲突了,现在有两种方式来解决:

  1. commit 先提交本地的修改,commit的原因是为了可追溯,通过本地branches就能拿到N+1个版本的修改。防止丢失
  2. stash 备份本地的修改 ,仍旧是防止丢失,且可以有多个版本 很灵活

演示-Stash如何使用 规避文件修改被冲掉

我们假设有两个人正在操作同一份文件 README.md
A君 : 我已经提交此文件的修改了,你更新下。
B君 : 我先Fetch看看有,然后我上传。嗯?冲突了。我并不知道你修改了什么个文件,我也不想在同步的时候把本地的修改冲掉。 那我提前 Stash 这些个文件吧。

机制的B君做了如下操作
Stash了勾选后的将本地修改在这里

B君 : 点击 可将指定的Stash文件与更新后的文件合并。

Stash 简单理解就是备份本地修改,且可以备份多次。什么?又冲突了?用Stash啊!

演示-使用commit来规避文件修改被冲掉

我们假设有两个人正在操作同一份文件 README.md
A君 : 我已经提交此文件的修改了,你更新下。
B君 : 我先Fetch看看有,然后我上传。嗯?冲突了。我并不知道你修改了什么个文件,我也不想在同步的时候把本地的修改冲掉。 那我提前 commit 这些个文件吧。

这个Push Change不用勾选,反正勾选也上传不了但是不影响commit。
现在pull也可以合并本地文件

commit 简单理解就是保存本次修改,且可以被追溯。什么你只会Stash?直接commit也行啊!

如何强推?

理解了上面的之后。发现 用Stash 或者Commit都可以实现强推。

现在commit肯定不行 因为被修改过了,sourcetree的机制是 点击按钮 默认commit,然后push

必然是失败的,点击OK,现在本地branch已经有了此次commit痕迹了(可追溯)

现在点击pull/或者Apply Stash 处理好,上传吧。

出了莫名其妙的问题如何补救?

有些朋友一看到一堆报错和本地紊乱的修改就慌了。别怕 可以直接回到存档(commit)点去复活。

直接回到某个commit的状态