git笔记

1:安装Git

1:在Linux上安装Git:

如果是Debian或Ubuntu,则通过一条命令:sudo apt-get install git, 如果是老一点的Debian或者Ubuntu, 命令则改为:sudo apt-get install git-core, 因为以前有个软件也叫GIT(GNU Interactive Tools),
结果Git只能用git-core了。由于Git名气实在太大,后来就把GNU Interactive Tools改成gunit, git-core正式改为git。

如果是其它版本linux版本,可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入:./config, make, make install这几个命令安装就好了。

2:在Mac OS X上安装Git:

第一种方法:安装homebrew,通过homebrew安装Git。具体方法参考homebrew的文档。

第二种方法:(推荐) 直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单Xcode->Prefeerences,在弹出窗口中找到Downloads,选择Command Line Tools,点击Install就可以完成安装。

3:在Windows上安装Git:

在Git官网直接下载windows系统的软件,安装即可。

2:全局配置

1:git config --global user.name "sid" // 全局配置用户名称

2:git config --global user.email "1003837059@qq.com" // 全局配置用户邮箱

3:git config --global core.quotepath off // 让含非ASCLL字符的文件名正确显示。

注:--global这个参数,表示这台机器上所有的Git仓库都会使用这个配置,当然也可以针对不同的仓库设定不同的用户名和Email地址。

3:创建版本库

1:mkdir learngit // 创建文件夹

2:cd learngit // 进入仓库

3:pwd // 打印路径

4:git init // 把当前文件夹编程Git管理的仓库。

注:

1:此时当前目录下多了一个.git的目录,这个目录是来跟踪管理版本库的。如果没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。
2:不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的。
3:所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件、网页、所有的程序代码等。而图片、视频、word文档等二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能告诉文件大小的改动。
4:文本是有编码的,强烈建议使用UTF-8编码,但千万不要使用windows自带的记事本编辑任何文本文件。因为它在每个UTF-8文件开头添加了0xefbbbf的字符。请使用NotePad++将默认编码设置为UTF-8 without BOM。

5:git add readme.txt // 把文件添加到仓库

注:

1:git add 1.txt 2.txt // 同时添加多个文件
2:git add -A // 添加所有的文件到缓存区。

6:git commit -m 'comment' // 把文件提交到仓库。-m:后面输入的本次提交的说明。

4:时光穿梭机

1:git status // 查看当前仓库文件的状态。

2:git diff readme.txt // 查看修改的内容。

5:版本回退

1:git log // 查看提交历史,以便确定要回退到哪个版本。

2:git log --pretty=oneline //只显示commit ID和注释。

3:git reset --hard HEAD^ // 回退到上一个版本。

注:在Git中,HEAD表示当前版本,也就是最新提交的commit ID,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

4:git reset --hard 3628164 // 回退到未来的某个版本

注:

1:版本号没必要写全,前几位就可以了,Git会自动去找。
2:Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD指向当前commit ID的版本。

5:git reflog // 查看命令历史,以便确定要回到未来的哪个版本。

6:工作区和暂存区

1:工作区:就是能在电脑里看到的目录, 不包括.git目录。

2:版本库:工作区有一个隐藏的.git目录,这个就是版本库。Git版本库存了很多东西,最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master, 以及指向master的一个指针叫HEAD。

注:git add命令实际上就是把要提交的所有修改放到暂存区(stage), 然后, 执行git commit就可以一次把暂存区的所有修改提交到分支。

7:管理修改

1:git diff HEAD -- readme.txt // 查看工作区和版本库里面最新版本的区别。

注:

1:git diff:查看working tree与index file的差别。
2:git diff --cached:查看index file与commit的差别。
3:git diff HEAD:查看working tree与commit的差别。

8:撤销修改

1:git checkout -- readme.txt // 丢弃工作区文件的修改。

注:--很重要,如果没有--, 则变成切换分支的功能。

2:git reset HEAD readme.txt // 丢弃添加到暂存区的文件的修改。

注:

1:文件修改后,没有add到暂存区,则checkout就可以恢复; 如果add到暂存区而没有提交到版本库,reset就可以丢弃暂存区的修改。
2:如果文件commit到版本库,则需要版本回退进行撤销修改; 如果push到远程服务器,则没有办法撤销修改。

9:删除文件

1:rm test.txt // 在文件管理器删除文件

2:git rm test.txt // 如果确实要从版本库中删除文件,那就用命令git rm删掉,并且git commit。

git rm --cached test.txt // 忽略对文件的跟踪。

3:git checkout -- test.txt // 另一种情况是删错了,因为版本库还有,所以用该命令很轻松的把误删的文件恢复到最新版本。

注:

1:git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以"一键还原"。
2:"删除"其实也是一种"修改"。

10:远程仓库

1:注册Github帐号(其实京东、淘宝、开源中国都有代码托管服务)。

2:创建SSH Key。由于本地的Git仓库和Github仓库之间的传输是通过SSH加密。在用户的主目录下,看看有没有.ssh目录,如果有,再看看目录下有没有id_rsa和id_rsa.pub文件,如果已经有了,可直接跳到下一步。没有则:

ssh-keygen -t rsa -C "1003837059@qq.com"

3:登录网站,点击"Add SSH Key", 填上任意Title, 在Key文本框里粘贴id_rsa.pub文件的内容。

4:为什么Github需要SSH Key呢?因为Github需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,Github只要知道你的公钥,就确认只有你才能推送。

11:添加远程库

1:登录Github网站,创建Github仓库。

2:git remote add origin git@github.com:sid/learngit.git

把本地的仓库和刚刚创建的Github仓库关联,添加后远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道远程库。

3:git push -u origin master

把本地的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和
远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

4:SSH警告

当第一次使用Git的clone或push命令连接Github时,会得到一个警告。这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认Github的Key的指纹信息是否真的来自Github服务器,输入yes回车即可。

5:git remote // 查看远程库

6:git remote rm origin // 删除远程库origin

12:从远程库克隆

1:git clone git@github.com:sid/gitskills.git // 克隆远程库

注:

1:你也许还注意到,Github给出的地址不止一个,还可以用https地址。实际上,Git支持多种协议,默认为git://使用ssh,但也可以使用https等其他协议。
2:使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
3:Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

13:创建与合并分支

1:操作流程

1:在Git里,初始的分支叫主分支,即master分支。HEAD严格意义上来说不是指向提交,而是指向master,master才是指向提交的,所以HEAD指向的就是当前分支。
2:一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确认当前分支,以及当前分支的提交点。
3:每次提交,master分支都会向前移动一步,这样随着你不断提交,master分支的线也越来越长。
4:当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。
5:Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化。
6:不过从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变。
7:假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并。
8:所以Git合并分支也很快!就改改指针,工作区内容也不变。
9:合并完分支,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩了一条master分支。

2:git checkout -b <name> // 创建dev分支,然后切换到dev分支。

注:git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

1:git branch <name> // 创建分支
2:git checkout <name> // 切换分支

3:git branch // 列出所有分支,当前分支前面会标一个*号。

1:git branch -a // 列出所有的分支(包括本地分支和远程分支)

2:git branch -r // 列出所有远程分支

4:git merge <name> // 合并某分支到当前分支。注意Fast-forward信息,Git告诉我们,这次合并是"快进模式",也就是直接把master指向dev的当前提交,所以合并速度非常快。

5:git branch -d <name> // 删除分支

6:git branch -vv // 查看本地跟踪分支对应的远程分支

14:解决冲突

1:操作流程

1:当两只分支各自都分别有新的提交,这种情况下,Git无法执行"快速合并",只能试图把各自的修改合并起来,但这种合并就可能会有冲突,合并分支:git merge feature1
2:查看起冲突的文件,直接查看readme.txt文件内容。Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。
3:git add readme.txt
4:git commit -m 'conflict fixed'

2:git log --graph --pretty=oneline --abbrev-commit // 查看分支合并图

3:总结

1:当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
2:如果传递--abbrev-commit给git log命令,输出的结果里就会使用简短且唯一的值;它默认使用七个字符来表示,不过必要时为了避免SHA-1的歧义,会增加字符数。
3:用git log --graph命令可以看到分支合并图。

15:分支管理策略

1:git merge --no-ff -m 'merge with no-ff' dev // --no-ff表示禁用Fast forward,因为本次合并要创建一个新的commit,所以加-m参数,把commit描述写进去。

注:

1:通常合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删掉分支后,会丢掉分支信息。
2:如果要强制禁用 Fast forward模式,Git就会在merge时生成一个新的commit,这样从分支历史上就可以看出分支信息。

2:分支策略

1:在实际开发中,我们应该按照几个基本原则进行分支管理。
2:首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活。
3:干活都在dev分支上,也就是说dev分支是不稳定的,到某个时候,比如1.0版本时,再把dev分支合并到master上,在master上发布1.0版本。
4:你和你的小伙伴每个人都在dev分支上干活,每个人都有自己的分支,时不时的往dev分支上合并就可以了。

3:总结

1:Git分支十分强大,在团队开发中应该充分应用。
2:合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而Fast forward合并就看不出来曾经做过合并。

16:BUG分支

1:git stash // 把当前的工作现场"藏匿"起来,等以后恢复现场继续工作。如果文件没有被Git管理,则不能"藏匿"起来。

2:git stash list // 查看stash列表

3:git stash pop // 回复最近"藏匿"的工作现场,并删掉该stash记录。

4:git stash apply stash@{0} // 指定恢复工作现场,但不会删除掉stash记录。

5:git stash drop stash@{0} // 删除指定的stash记录。

6:git stash clear // 清空stash队列

7:总结

1:修复BUG时,我们会通过创建新的BUG分支进行修复,然后合并,最后删除。
2:当手头工作没有完成时,先把工作现场git stash一下,然后去修复BUG,修复后,再git stash pop,回到工作现场。

17:Feature分支

1:git branch -D <name> // 强行删除一个没有被合并过的分支。

18:多人协作

1:git remote // 查看远程信息

2:git remote -v // 显示更详细的远程信息,显示可以抓取和推送的origin地址,如果没有推送权限,就看不到push地址。

3:git push origin master // 把本地某分支上的所有本地提交推送到远程库,推送时要指定本地分支,这样Git就会把该分支推送到远程库对应的远程分支上。

4:git checkout -b dev origin/dev // 创建和远程分支dev对应的本地分支dev,push本地分支dev,默认推送到origin/dev分支上。

5:git pull // 拉去远程分支代码

6:git branch --set-upstream dev origin/dev // 设置本地dev分支和远程origin/dev分支的链接。

7:总结

1:当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且远程仓库的默认名称就是origin。
2:当提交代码有冲突,推送代码失败时,应该先用git pull把最新的提交拿下来,在本地合并解决冲突再推送。
3:git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接。
4:如果git pull提示"no tracking information",则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name

19:标签管理

1:总结

1:发布一个版本时,我们通常先在版本库中打一个标签,这样就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。
2:所以,标签也是版本库的一个快照。
3:Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针。但是分支可以移动,标签不能移动。所以,创建和删除标签都是瞬间完成的。

20:创建标签

1:git tag v1.0 // 切换到需要打标签的分支,打一个标签v1.0。默认指向HEAD,也可以指定一个commit id。

2:git tag // 查看标签列表

3:git tag v0.9 75a857c // 给commit id为75a857c的提交打标签。

4:git show <tagname> // 查看标签信息。

5:git tag -a v1.1 -m 'version 1.1 released' 75a857c // 创建带有说明的标签,用-a指定标签名,-m指定说明文字。

6:git tag -s v1.2 -m 'signed version 1.2 released' 75a857c // 通过-s用私钥签名一个标签。

7:总结

1:默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如:现在已经是周五了,但应该在周一打的标签没有打怎么办?方法是找到历史提交的commit id,然后打上就可以了。
2:注意,标签不是按时间顺序列出,而是按字母排序的。
3:签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错。
4:如果报错,请参考GnuPG帮助文档配置Key,用命令git show <tagname>可以看到PGP签名信息。

21:操作标签

1:git tag -d v0.1 // 删除标签

2:git push origin <tagname> // 推送某个标签到远程。

3:git push origin --tags // 一次性推送全部尚未推送到远程的本地标签。

4:git push origin :refs/tags/v0.9 // 删除远程标签v0.9

5:总结

1:删除远程标签时,先删除掉本地的标签。

22:使用Github

1:总结

1:在Github上,可以任意Fork开源仓库。
2:自己拥有Fork后的仓库的读写权限。
3:可以推送pull request给官方仓库来贡献代码。

23:自定义git

1:git config --global color.ui true

24:忽略特殊文件

1:总结

1:忽略某些文件时,需要编写.gitignore。
2:.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理。

2:忽略文件的原则

1:忽略操作系统自动生成的文件,比如缩略图等。
2:便略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库。
3:忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

25:配置别名

1:git config --global alias.st status // 告诉Git,以后用st就表示status。好了,现在敲git st的看看效果。

2:git config --global alias.unstage 'reset HEAD' // 当你敲入命令git unstage test.py,实际上Git执行的是git reset HEAD test.py

3:git config --global alias.last 'log -1' // 这样,用 git last 就能显示最近一次的提交。

4:git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" // 查看git lg的效果吧。

5:总结

1:配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
2:每个仓库的Git配置文件都放在.git/config文件中,而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中。

26:搭建Git服务器

1:操作流程

1:安装git,sudo apt-get install git
2:创建一个git用户,用来运行git服务,sudo adduser git
3:创建登录证书,收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
4:初始化Git仓库,先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令,sudo git init --bare sample.git
5:Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。
6:然后把owner改为git,sudo chown -R git:git sample.git。
7:禁止Shell登录,出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行,
git:x:1001:1001:,,,:/home/git:/bin/bash,修改为 git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell,这样git用户可以正常通过ssh使用git,但无法登录shell,
因为我们为git用户指定的git-shell每次一登录就自动退出。
8:克隆远程仓库。现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行。

2:管理公钥

1:如果团队很小,把每个人的公钥收集起来放在服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了。这时,可以用Gitosis来管理公钥。

3:管理权限

1:Git不支持权限控制,不过因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。

4:总结

1:方便管理公钥,用Gitosis。
2:要像SVN那样变态地控制权限,用Gitolite。

27:管理远程分支和标签

1:git branch -a // 查看所有分支,远程分支会用红色表示出来(如果你开了颜色支持)。

2:git push origin --delete <branchName> // 删除远程分支(Git v1.7.0后)

3:git push origin --delete tag <tagname> // 删除远程标签(Git v1.7.0后)

4:git push origin :<branchName> // 推送一个空的分支,相当于删掉远程分支。

5:git push origin :refs/tags/<tagname> // 推送一个空的标签,相当于删除远程标签。

6:git branch -m oldname newname // 重命名分支,如果newname名字分支已经存在,则需要使用-M强制重命名。

7:git fetch origin tag <tagname> // 获取远程tag。

28:Git拾遗

1:git log -p <filename> // 查看某一个文件的详细提交记录

2:git commit --amend // 当我们提交完以后发现有几个文件没有提交,运行此命令,则会把暂存区的文件提交,快照不变。

3:git commit -m 'comment' xxx.file // 指定需要单独提交的文件,如果不指定,默认提交所有待commit的文件。

4:git mv old_name new_name // 修改文件名称

5:git revert HEAD^ // 也是撤销命令,区别在于reset是指向原地或者向前移动指针,git revert是创建一个commit来覆盖当前的commit,指针向后移动。

6:git checkout commit_id -- path_to_file // Git恢复被删文件

7:git revert --abort // 退出revert命令。

29:Git pull

1:git pull <远程主机名> <远程分支名>:<本地分支名>

比如:git pull origin next:master,取回origin主机的next分支,与本地的master分支合并。

2:git pull origin next // 远程分支和当前分支合并,则冒号后面的部分可以省略。

上面的命令表示,取回origin/next分支,再与当前的分支合并。实质上,这等同于先做git fetch,再做git merge。

git fetch origin
git merge origin/text

3:git branch --set-upstream master origin/text // 指定master分支追踪origin/next分支

在某种场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系。

4:git pull origin // 如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。

如果当前分支只有一个追踪分支,连远程主机名都可以省略。

5:git pull --rebase <远程主机名> <远程分支名>:<本地分支名> // 如果合并需要采用rebase模式,可以使用--rebase选项。

30:Git push

1:git push <远程主机名> <本地分支名>:<远程分支名>

git push将本地分支的更新,推送到远程主机。注意和git pull用法的区别。

2:git push origin master // 将本地的master分支推送到origin主机的master分支上。如果后者不存在,则会被创建。

如果省略远程分支名,则表示本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。

3:git push origin :master // 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。

等同于 git push origin --delete master

4:git push origin

如果本地分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。

5:git push

如果当前分支只有一个追踪分支,那么主机名都可以省略。

6:git push -u origin master

如果当前分支与多个主机存在追踪关系,则可以试用 -u 选项指定一个默认主机,这样后面就可以不加任何参数使用git push。

7:git config --global push.default matching 或者 git config --global push.default simple

不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。在Git 2.0之前,默认采用matching方法,
现在改为默认采用simple方式。如果要修改这个设置,可以采用git config命令。

8:git push --all origin

不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用--all选项。

9:git push --force origin

如果远程主机的版本比本地版本更新,推送时Git会报错。要求先在本地做git pull合并差异,然后再推送到远程主机。这是,如果一定要推送,可以使用--force选项。
上面命令使用--force选项,结果导致在远程主机产生一个"非直进式"的合并(non-fast-forward merge)。除非你很确定要这样做,否则应该尽量避免使用--force选项。

10:git push origin --tags

git push不会推送标签(tag),除非使用--tags选项。

31:Git fetch

1:git fetch <远程主机名>

一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到git fetch命令。

2:git fetch <远程主机名> <分支名>

默认情况下,git fetch取回所有分支的更新。如果只想取回特定分支的更新,可以指定分支名。

32:Git remote

1:git remote

为了方便管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。不带选项的时候,git remote命令列出所有远程主机。

2:git remote -v

使用-v选项,可以查看远程主机的网址。

3:git clone -o jQuery url

克隆版本库的时候,所使用的远程主机自动被Git命名为origin。如果想用其它的主机名,需要用git clone命令的-o选项指定。

4:git remote show <主机名>

查看主机的详细信息。

5:git remote add <主机名> <网址>

添加远程主机。

6:git remote rm <主机名>

删除远程主机。

7:git remote rename <原主机名> <新主机名>

更改远程主机的名称。

33:Git log

1:git log

如果不带任何参数,它会列出所有历史记录,最近的排在最上方,显示提交对象的哈希值,作者、提交日期、和提交说明。如果记录过多,则按Page Up、Page Down、↓、↑来控制显示;按q退出历史记录列表。

2:git log -n

-n选项显示最近n条记录。

3:git log --stat -n

--stat选项显示简要的增改行数统计,每次提交文件的变更统计。-n 同上,前n条,可省略。

4:git log -p -n

-p选项展开显示每次提交的内容差异。

5:git log --pretty=oneline

一行显示,只显示哈希值和提交说明。

6:git log --graph

ASCII 字符串表示的简单图形,形象地展示了每个提交所在的分支及其分化衍合情况。

7:git log --pretty=format:" "

控制显示的记录格式,常用的格式占位符写法及其代表的意义如下:

选项 说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明

8:指定日期、关键字、作者

选项 说明

-(n) 仅显示最近的 n 条提交
--since, --after 仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author 仅显示指定作者相关的提交。
--committer 仅显示指定提交者相关的提交。

例如:git log --since=2.days

34:Git blame

1:git blame file_name

查看文件每个部分的修改信息。

2:git blame -L 160,+10 file_name

使用-L参数指定开始和结束行。

35:解决 Git 的 Merge Conflict

1:git pull --rebase origin remote // 将你的版本加在最后的节点上

如果有冲突,会提示你。冲突分为两种,一种是在不同地方的冲突,通常情况下,git是可以自己合并的。另外一种是因为可能是同一个文件的编辑,git没法自动合并,需要二选一,这时候打开冲突的文件,手动编辑文件到可用的版本。然后。。

2:git rebase --continue

重复1,2直到所有的都solve。

3:git push

 

ssh-keygen -t rsa -C "cool.li@cnbexpress.com"

posted @ 2016-12-14 11:44  李元夕cool  阅读(104)  评论(0编辑  收藏  举报