vv13
博客订阅

git实用命令技巧

git pull --rebase

从分支上拉取最新的代码时,往往会多出一条merge记录,这样有时不是我们所期望的,因为它会让整个提交线图变得难以理解:

我们期望的分支图也许时这样的:

只需要将git pull -> git pull --rebase。rebase的好处就在于,它会将当前新的提交记录,全部追加到远程提交信息记录之后:

合并前:
        D---E master
      /
A---B---C---F origin/master

merge合并:
    D--------E  
  /           \
A---B---C---F---G   master, origin/master

rebase合并:
A---B---C---F---D---E   master, origin/master

如果遇到冲突,请将冲突解决后执行: git rebase --continue。它也有两面性,至于谁好谁坏,慎用就行了。

获取远程库的更新

普通的工作流程一般是先folk整个工程到本地,再添加上游分支:

git remote add upstream https://xxx.git

这样一来,我们就可以获取远程的更新到当前分支:

git pull upstream master

若拉取本地不存在的分支,则可以使用这条命令:

git checkout -b new_branch upstream/new_branch

推送多个远程库

用法:

$ vim ~/.git/config

[remote "upstream"]
        url = git@gitlab.main.com:project.git
        url = git@github.main.com:project.git

$ git push upstream

解释:通过编辑config文件,给远程库多添加一个url,那么再执行push操作时,就可以同时push两个库,如上github与gitlab仓库的项目都会更新。

合并多个提交

有些时候,本地会做多个commit提交,但是在push之前,合并为1个提交会显得更清晰,此时就需要借助git rebase -i HEAD~N了,其中N代表的是最近几次提交,执行后将需要合并的commit从pick改为squash,再重写提交记录即可。

更改提交人

在有一次和小伙伴协作代码时,由于需要伪造成同一个身份,让代码管理者看commit历史以为是同一个人做的,因此就用到了--author参数,提交的格式为:name<mail>,比如:git commit -m 'feat: something' --author="TJ<mail@gmail.com>",这是通过git log即可看到作者信息发生了变化。

Stash

用于保存和恢复工作现场,如在切分支时、拉取代码、热修复时,需要将当前修改的文件内容储存起来,完成另一个场景的个工作,再恢复现场,以下是一些常用命令:

  • git stash

    保存当前的工作进度。会分别对暂存区和工作区的状态进行保存

  • git stash save "message..."

    这条命令实际上是第一条 git stash 命令的完整版

  • git stash list

    显示进度列表。此命令显然暗示了git stash 可以多次保存工作进度,并用在恢复时候进行选择

  • git stash pop [--index][<stash>]

    如果不使用任何参数,会恢复最新保存的工作进度,并将恢复的工作进度从存储的工作进度列表中清除。

    如果提供参数(来自 git stash list 显示的列表),则从该 <stash> 中恢复。恢复完毕也将从进度列表中删除 <stash>

    选项--index 除了恢复工作区的文件外,还尝试恢复暂存区。

  • git stash apply [--index][<stash>]

    除了不删除恢复的进度之外,其余和 git stash pop 命令一样

  • git stash clear

    删除所有存储的进度

其他

  • 删除远程分支:$ git push origin --delete

  • 推送本地分支:$ git push <远程主机名> <本地分支名>:<远程分支名>