基本业务场景处理
1. 使用git查看比较两次提交的差异,仅查看变化的文件:
git diff code1 code2 --name-only
2. 使用git比较两次提交的差异:
git diff code1 code2
以上命令即将列出所有的文件及改动部分;注意比较次序,是code2相对于code1的变动,即code2被认为是最近提交;
同时如果想以当前提交作为起点进行推算,那么可以借助HEAD指针:
git diff HEAD~1 HEAD~0 --name-only
以上命令表示列出上上次提交和最近一次提交变动的文件列表;
3. 使用git提交到远程分支
git push origin local_branch_name:remote_branch_name
其中 local_branch_name即为本地当前的提交分支名称; remote_branch_name即为将提交至的远程分支名称;
当然如果已经建立了本地分支和远程分支的追踪关系,那么直接可以省掉后面的分支信息:
git push origin
4. 建立本地分支与远程分支的追踪关系
为了便于分支管理和提交,最好的做法是在本地创建分支时即创建本地分支与远程分支的追踪关系,并且为了方便,最好是使用相同的分支名称:
git checkout -b local_branch_name origin/remote_branch_name
通过这种方式,就可以直接在本地创建一个与远程分支相对应的本地分支;
5. 显示当前所有本地分支与远程分支的追踪关系
为了实时看到当前的分支状态:本地所有分支、本地分支和远程分支的追踪关系、当前分支的更新状态等;
git remote show origin
6. 本地修改与远程代码合并
同一个分支当前可能同时由多人在协同开发,因此在提交本地修改时,本地代码可能已经过期,需要与远程分支上最新代码合并之后才能提交;
1. 首先需要保存下我们当前本地的修改:
git stash
2.当执行完以上命令,当前本地将回到修改前的commit,此时可以继续更新远程分支上的提交:
git pull origin
此时,远程分支上的提交就会被同步下来,此时本地代码已经被同步为远程分支上的最新代码;
3.此时需要将我们之前所做的修改与当前库上最新的代码进行合并
git stash pop
并且会执行自动合并,如果没有冲突,那就可以检查后直接提交;但是如果有冲突,就去合并之后的文件中找到冲突的地方,全部冲突修改完成之后,再提交即可;
关于stash 的用法后面还有更多介绍。
基本命令功能
本节对各个基本命令的用法/参数进行详细的介绍,深入了解各个命令的详细用法,可以覆盖更多的业务场景,提升管理效率。
1. git stash
git stash 命令用于暂存当前本地工作临时状态,用于紧急处理其他任务/合并远程修改进行本地提交/本地变更尝试方案等场景。
//会将当前的工作状态进行缓存,默认有递增id
git stash
//在将当前的工作状态进行缓存的同时,给本地缓存进行备注
git stash save "description"
//查看当前已经缓存列表
git stash list
//根据在stash list中的缓存列表id,可以指定恢复到某一个工作状态
git stash apply stash@{id}
//与apply命令不同,执行pop命令之后,stash缓存中即会移除该stash;
git stash pop stash@{id}
//清除所有stash缓存
git stash clear
//移除某个stash
git stash drop stash@{id}
git stash 支持跨分支的,但是同时每个stash均会有所在分支及基准commit记录,因此可以清晰知道每个stash该合并到何处分支的commit。
2. 关联远程分支
git remote remove origin
git branch --set-upstream-to origin/develop develop
//或者
git remote add origin git@github.com:git_username/repository_name.git
3. 添加忽略文件
//将文件移除track, git status将不会看到
git update-index --assume-unchanged <files>
//重新恢复track
git update-index --no-assume-unchanged <files>
当不小心忽略的文件过多,有如下相关操作:
- 查看当前被忽略的文件
git ls-files -v | grep '^h\ '
- 查看所有当天被忽略文件的路径
git ls-files -v | grep '^h\ ' | awk '{print $2}'
- 恢复所有当前被忽略的文件
git ls-files -v | grep '^h' | awk '{print $2}' |xargs git update-index --no-assume-unchanged
4. 统计代码修改量
git log --author="username" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -
修改username之后执行将会打印:
added lines: 120745, removed lines: 71738, total lines: 49007
统计所有人的修改量:
//统计提交贡献量前5名
git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5
//查看所有人的提交情况
git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
修改当前分支名称:
git branch -m old_branch_name new_branch_name
5. 配置difftool
安装beyond compare之后可以设置为git比较工具。
git查看有哪些对比工具可以设置命令:
$ git difftool --tool-help
会得到如下列表:
'git difftool --tool=<tool>' may be set to one of the following:
vimdiff
vimdiff2
vimdiff3
The following tools are valid, but not currently available:
araxis
bc
bc3
codecompare
deltawalker
diffmerge
diffuse
ecmerge
emerge
examdiff
guiffy
gvimdiff
gvimdiff2
gvimdiff3
kdiff3
kompare
meld
opendiff
p4merge
tkdiff
winmerge
xxdiff
Some of the tools listed above only work in a windowed
environment. If run in a terminal-only session, they will fail.
然后再设置对比工具:
$ git config --global diff.tool bc3
$ git config --global difftool.bc3.path "c:/program files/beyond compare 3/bcomp.exe"
如果安装的是beyond compare 4,那么也同样设置为bc3,并指向beyond compare 4的安装地址。
或者可以直接修改.gitconfig文件:
[diff]
tool = bc3
[difftool "bc3"]
path = d:/program files/beyond compare 3/bcomp.exe
[merge]
tool = bc3
[mergetool "bc3"]
path = d:/program files/beyond compare 3/bcomp.exe
6. --no-commit
如果在合并某个分支之前想看一下详细的所有变动后微调再提交而不是直接合并生成commit,那么这个命令就很管用。
常规场景:
git merge test_branch
假设此时test_branch上有一个0329c的commit即将合并到master,如果没有冲突,执行合并完成后会在master上生成一个新的commit。但是如果需要有人帮忙review或者还可能需要微调后才能合并到master,那么可以避免直接生成这个commit:
git merge test_branch --no-commit
git reset
git difftool
这样不管有没有冲突,就可以进行改动的review,十分方便。