git 使用笔记(持续更新)

基本业务场景处理

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,十分方便。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,855评论 5 147
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,905评论 0 11
  • Git常用语法 [TOC] Git简介 描述 ​ Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,...
    君惜丶阅读 3,497评论 0 13
  • 芝士跟乳酪是两种东西吗?乳酪跟奶酪又有什么关系呢?还看过一款叫干酪的,到底是什么?其实,这些都是同样的东西,它们的...
    食潮阅读 16,663评论 8 107
  • 在项目中使用vue我使用vue-cli脚手架搭建项目 1.先安装nodejs 2.使用npm install -g...
    LI_4058阅读 536评论 0 0