文章

git方法

git的一些使用技巧。

git方法

git blame

git blame命令可以查看到每行代码的提交详情,包括提交人、提交时间、提交信息等。使用方法也很简单,通过命令

1
git blame <filename>

会返回文件里每一行的代码的提交ID,提交人,提交时间,这是blame最简单的语法去查看每一行的提交历史。但我们一般都只需要查看某一行或某一部分代码的提交信息,这时候可以通过一些命令进行筛选

关键词检索

在git blame界面,按下/键,待终端左下角显示了/字符后,输入关键词并回车,这时会在filename文件中找到你要搜索的关键词并跳转到那一行,并且可以n/shift + n进行下一个/上一个关键词跳转(使用跟vim的搜索功能一样)

范围筛选

当我们需要查看某一段代码的blame记录时,可以使用-L参数

1
glt blame <filename> -L <start>[,<end>]

start参数是需要查看的段落的第一行,end参数可选,是需要查看段落的最后一行,不选的话测试查看到文件最后一行。同时end也可以使用正负号,表示往前或往后,例如git blame <filename> -L 10,+5是查看第10行及后面5行的数据

git log

有时候想查看git log的提交信息,这时候就可以用到git log搜索关键词的指令

查找含有某个字符串的commit

1
2
// 搜索提交记录里提交信息含有字符串commit的提交
git log --grep=search

查看某个作者

1
2
// 查看作者为xiaoming的提交记录
git log --author=xiaoming

git log其他指令

1
2
3
4
5
git log --oneline 或者 git log --pretty=oneline 以精简模式显示
git log --graph 以图形模式显示
git log --stat 显示文件更改列表
git log -10 显示10个提交
git log -p 提交里显示每次提交所引入的差异

git rebase

Git Rebase,即变基,用于整合Git中来自不同分支的修改。这个命令一般很少使用,但在一些情况下,使用这个命令可以大幅提高效率。

Git Rebase目前的话有以下两个使用场景:开发分支更新以及合并修改提交

分支合并

加入有以下场景,master为跟别人一起开发的远程分支,experiment是基于master分支提交C2创建的开发分支,并且在开发分支下提交了C4。这时候,主分支有一个新提交C3。

因为主分支上有了更新,如果你在experient继续开发前先同步开发分支到最新,最简单的方法是使用merge命令。它会将两个分支的最新快照C3C4以及父节点C2进行三方合并并且生成一个新的快照。

在experiment分支下,使用git merge master命令后,experiment分支的提交会变成下图这样(通过命令git log --oneline --graph查看)

可以看到merge合并,是通过共同的节点C2以及两个分支上的新提交进行合并成一个新提交的。这种操作比较简单易懂,但是因为合并所以会多出一个提交记录。本文介绍rebase的操作。

切换到experiment分支下,通过命令git rebase master进行操作。rebase工作的流程首先是先将experiment分支下相对于父节点C2新增的提交C4提取出来,然后将该提交在C3的基础上进行应用,即进行变基操作,将git提交历史的基从父节点C2变换到master分支上最新提交C3上。

通过git log --oneline --graph查看experiment分支的提交历史

可以看到,经过rebase合并后,通过变基使experiment分支的提交历史更加简洁,提交历史是一条直线没有分叉。

一般我们这样做的目的是为了确保在向远程分支推送时能保持提交历史的整洁——例如向某个其他人维护的项目贡献代码时。 在这种情况下,你首先在自己的分支里进行开发,当开发完成时你需要先将你的代码变基到origin/master上,然后再向主项目提交修改。 这样的话,该项目的维护者就不再需要进行整合工作,只需要快进合并便可。

提交合并

继续上边的例子,在experiment分支下,继续进行开发,新建一个文件并创建一个提交,接着,在新文件中每添加一行文本也创建一个提交,最终log的记录如下

可以看到,提交f4d8bcd是新建了一个文件,而85c9b8c到e101bd3则都是往新的文本内添加内容。其实这四个提交就是实现了新建一个文件并添加文本的功能,但是却占用了4个commit,如果说想把这四个提交合并在一起的话,也可以使用rebase命令

执行命令:git rebase -i HEAD~4可以合并最近四次的提交记录,这时候终端会进入到vi的编辑模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
pick f4d8bcd add file text2
pick 85c9b8c add D1 to text2
pick 985b214 add D2 to text2
pick e101bd3 add D3 to text2

# Rebase afa510d..e101bd3 onto afa510d (4 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

在编辑模式内,需要关注到这几个命令参数

  • p, pick = use commit 使用该提交
  • r, reword = use commit, but edit the commit message 使用该提交并且编辑该提交的信息
  • e, edit = use commit, but stop for amending 使用该提交并且停留在该提交上进行修改
  • s, squash = use commit, but meld into previous commit 使用该提交并且合并到上一个提交中
  • f, fixup = like “squash”, but discard this commit’s log message 类似于squash,不过丢弃提交信息
  • x, exec = run command (the rest of the line) using shell 在每行创建提交之后附加一条shell命令
  • d, drop = remove commit 丢弃这个提交

假如说,我想把85c9b8c到e101bd3这三个提交合并到f4d8bcd,可以这么编辑

1
2
3
4
pick f4d8bcd add file text2
squash 85c9b8c add D1 to text2
squash 985b214 add D2 to text2
squash e101bd3 add D3 to text2

或者

1
2
3
4
pick f4d8bcd add file text2
fixup  85c9b8c add D1 to text2
fixup  985b214 add D2 to text2
fixup  e101bd3 add D3 to text2

这时候这四个提交会被合并在一起了,第一种方法和第二种方法的差别在于,第一张方法合并后会将这四个提交的提交信息记录在合并后的提交信息里,而第二种方法合并后,则直接使用被pick的提交的提交信息。相对来说第二种方法合并后的提交记录更加简洁,而第一张方法所展示的信息更加全面

修改之前某一次的提交

假如进行一系列地提交后,发现某个提交有些内容有误重新修改,但又不想再多一个提交,这时候可以使用rebase跳回到需要修改的提交,重新修改提交后再回到最后一个提交。

加入这里有5个提交,提交3的内容需要重新修改

1
2
3
4
5
b4c2dd5 (HEAD -> master)  commit 5
a517f3f  commit 4
e3f1d53  commit 3
e9fb857  commit 2
fc6b802  commit 1
  1. 使用rebase命令回退提交

    1
    2
    3
    4
    5
    
     git rebase e3f1d53^ --interactive
     // 或
     git rebase e9fb857 --interactive
     // 或
     git rebase -i HEAD~3
    
  2. 在编辑框内将需要修改的提交pick改为edit

  3. 修改内容

  4. 暂存并进行提交

    1
    2
    
     git add <file>
     git commit --amend
    
  5. 恢复所有提交记录

    1
    
     git rebase --continue
    

git update-index

  1. 作用

    git 忽略某个文件夹的修改状态

  2. 参数

    • --[no-]assume-unchanged 对已被跟踪的文件做了修改后,文件不会出现在modified列表中,使用resetcheckout会将文件恢复回去
    • --[no-]skip-worktree 对已被跟踪的文件做了修改后,不会被git检测到,忽略文件的修改
  3. 查看哪些文件打了标识

    • skip-worktree : git ls-files -v | grep -i ^S
    • assume-unchanged : git ls-files -v | grep ^h
本文由作者按照 CC BY 4.0 进行授权