调试shell脚本时,多次测试 git pull 的方法

我们在实际工作中,可能会想到编写 shell 脚本来自动化执行一些 git 命令,例如执行 git pull 自动更新代码,并从打印的文件改动信息中过滤掉那些不需要的信息。

但是在测试、调试 shell 脚本时,会发现一个比较困扰的问题:执行 git pull 后,本地仓库已经跟远端服务器保存一致,再次执行 git pull 没有实际更新代码的效果,无法验证对改动信息的过滤是否正确。

如果想要多次测试 git pull 的效果,需要先让本地仓库代码落后于远端服务器代码。具体方法说明如下。

方法一

先执行 git checkout -b local_branch_name HEAD~2 命令,或者执行 git checkout -b local_branch_name commit 命令:

  • HEAD 指向当前最新版本,HEAD~1 指回退一个版本,也就是上一个版本,可以简写为 HEAD~HEAD~2 指回退两个版本。依次类推,可以指定本地分支要落后于服务器多少个版本。
  • commit 参数是 git commit 的hash值,通过 commit 参数来指定要回退到哪一个提交。
  • 这两个命令的作用是,创建一个新的分支,且新分支的代码已经落后于远端服务器代码

接下来用 git pull remote_repository remote_branch_name 来更新代码,就能看到 git pull 的更新效果。这时不能只执行 git pull 命令,否则会报下面的错误:

fatal: No remote repository specified. Please, specify either a URL or a remote name from which new revisions should be fetched.

当这样pull之后,当前本地分支代码已经最新,再次pull就没有新的改动。如果想要再测试pull效果,可以再创建新的本地分支。

上面执行 git checkout 的时候也可以先不加 -b 选项,先执行 git checkout HEAD~2 命令或者 git checkout commit 命令,执行之后,当前就不处于任何分支下,git 提示可以用 git checkout -b new_branch_name 来创建新的本地分支,然后再用上面的方法来进行pull。

即,总共需要执行下面几个命令来多次测试git pull的效果,具体参数值要换成实际仓库的值:

$ git checkout -b local_branch_name HEAD~2
$ git pull remote_repository remote_branch_name

方法二

如果不想多次创建新的分支,想在当前的本地分支上多次测试 git pull,可以参考下面方法。

先执行 git reset commit 命令,commit 参数是 git commit 的hash值,指定要回退到哪一个提交。那么本地代码会被回退,用 git status 命令查看,会看到有一些文件还没有被提交,此时无法执行 git pull,会提示 "Cannot pull with rebase: You have unstaged changes."

接下来需要重新执行 git add、git commit 进行提交,之后就可以用 git pull remote_repository remote_branch_name 命令来更新。此时,如果 git pull 用的是 git merge 就会提示 branch merge,自动弹出 merge comment,需要手动确认。
如果 git pull 用的是 git rebase,不会提示 branch merge,不需要填写或手动确认 merge comment。

即,这个方法需要执行下面几个命令来多次测试 git pull 的效果,具体参数值要换成实际仓库的值:

$ git reset commit_hash
$ git add -A
$ git commit -m "your commit message"
$ git pull --rebase remote_repository remote_branch_name