首页 > 代码库 > Git常用命令

Git常用命令

分布式版本控制系统

配置文件:

/etc/gitconfig 系统对所有用户普遍适用的配置

~/.gitconfig 用户目录下的配置文件只适用于该用户

 

工作目录下不外乎两种状态:以跟踪或未跟踪。

 

Changes to be committed 在这行下面,就说明是以暂存状态,如果此时提交,那么该文件此时此刻的版本就被留存在历史记录中。(git add file(new file, modified file:暂存)


on branch master 说明目前分支

 

1 git pull origin index2.0

从服务器上拉取最新代码

 

2.git checkout

检查更新

 

3.git stash 

消除modified文件

 

4.git statsh pop

恢复modified文件

 

5.查看本地log文件

git log

 

6.查看远程git文件(图形化)

gitk

 

7.配置信息
git config --global user.name “Pan kai”

git config --global user.email “kaipan@tagalong.cc”

 

8.设置默认使用的文本编辑器(系统默认使用vim)、分页器
git config --global core.editor vim

git config --global core.pager ‘’

 

9.配置参数
git config --list 重复的参数说明来自不同的配置文件,但git实际采用~/.gitconfig配置文件

 

10.从现有仓库克隆

git clone url(git支持许多传输协议)

例如:git clone git://github.com/schacon/grit.git

自定义项目名称:

git clone git://github.com/schacon/grit.git mygrit

 

11.忽略某些文件 
总会有文件无需纳入git的管理,也不希望它们总出现在未跟踪文件列表,通常都是些自动生成的文件,像是日志或者编译过程中创建的等等。
vim .gitignore 

 

12.当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容
git diff
暂存区域和上次提交时的快照之间的差异
git diff --cached(git diff --staged)

 

13.提交更新

git commit

git commit -m ‘注释信息’

 

14.跳过暂存区域
git commit -a(跳过git add,被跟踪的文件)

15.从暂存区域移除文件(连同从工作目录删除)
git rm file

 

16.从暂存区域移除不被跟踪的文件
git rm --cached file

 

17.移动文件

git mv file_from file_to
重命名,git mv README.txt README 等同于:
mv README.txt README

git rm REAME.txt

git add README

 

18.查看提交历史
git log(按时间列出所有的更新)

git log -p(展开显示每次提交的内容差异)

git log -2(仅现实最近的两次更新)

git log -p -2

 

19.列出修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行小计(+++++++++------)
git log --stat

20.将每个提交放在一行展示, 格式输出、简单图形、时间、作者
git log --pretty=oneline

git log --pretty=format:”%h - %an, $ar : %s”

git log --pretty=format:”%h - %an, $ar : %s --graph

git log --pretty=format:”%h - %an, $ar : %s --graph   --author =gitster --since=”2008-10-01”--before=”2008-11-01”

 

21.使用图形化工具查阅提交历史

gitk

 

22.修改最后一次提交

git commit --amend
例如:

git commit -m ‘initial commit’

git add forgotten_file

git commit --amend

上面的三条命令最终将得到一个提交,第二个提交命令修正了第一个的提交内容

 

23.取消已经暂存的文件

git reset HEAD file

 

24.取消对文件的修改
git checkout -- file

 

25.查看当前的远程库

git remote
加上 -v选项,显示对应的克隆地址:

例如 git remote -v:
origin http://Pankai:12345678a@192.168.1.133/git/tagalong-web.git(fetch)

origin http://Pankai:12345678a@192.168.1.133/git/tagalong-web.git(push)

 

26.从远程仓库抓取数据

git fetch remote-name(会抓取上次克隆以来别人上传到远程仓库中的所有更新(或是上次fetch以来别人提交的更新)),不合并分支,

所以一般运行git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中当前分支。

27.推送数据到远程仓库

git push [remote-name] [branch-name]

28.查看远程仓库信息

git remote show [remote-name]

 

29.新建标签

轻量级:不会变化的分支,实际上它就是个指向特定提交对象的引用。

含附注:实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也容许使用GUN Privacy Guard(GPG)来签署或验证。

git tag(查看标签)

新建含附注:git tag -a v1.4 -m ‘my version 1.4’(用 -a,-m 注释)

查看标签信息:git show v1.4

签署标签:如果你有自己的私钥,还可以用GPG来签署标签,只需把之前的-a改为-s

查看标签信息:git show v1.5

验证标签:git tag -v [tag-name]

 

30.后期加注标签

git log --pretty=oneline

git tag -a v1.2 9fceb02(提交对象的校验和(或前几位字符))

 

31.分享标签

git push origin [tagname]

 

32.自动完成

git command<tab><tab>

例如:

git co<tab><tab>

commit config

 

33.Git命令别名

例如:

git config --global alias.ci commit(ci代替commit提交)

 

34.创建分支

git checkout -b hotfix

相当于:

git branch hotfix(创建分支)

git checkout hotfix(切换分支)

35.合并分支

git checkout master

git merge hotfix(同一分支线)

git merge iss5(不同分支,共同祖先)(找到祖先节点合并到这一节点)

36.删除分支

git branch -d hotfix

 

37.冲突合并

<<<<<<< HEAD:index.html

code1

========

code2 

>>>>>> iss53:index.html
HEAD master分支,在运行merge命令时检出的分支中的内容,下半部分是在iss53分支中的内容,二者的办法是选其一亲自整合到一起。

解决完之后使用git commit合并提交

 

38.查看已合并分支

git branch --merged

结果:

iss53

master

 

39.查看还未合并的分支

git branch --mo-merged
没有*号的分支通常都可以用git branch -d iss53删掉

 

40.长期分支

 

 

 

41.远程分支

git remote add url(例如:git://git.team1.ourcompany.com)

git checkout -b [分支名] [远程名]/[分支名]:新建分支同远程分支一致。

 

42.推送本地的某一个分支,把它推送到一个你具有写权限的远程仓库

git push origin serverfix(取出我的serverfix本地分支,推送它来更新远程仓库的的serverfix分支)

等价于:git push origin serverfix:serverfix。

git fetch origin命令之后,你仍然无法在本地编辑该远程仓库,换句话说,你不会有一个新的serverfix分支,有的只是一个你无法移动的origin/serverfix指针。如果要把内容合并到当前分支,可以运行origin/serverfix,如果想要一份自己的serverfix来开发,可以在远程分支的基础上分化出一个新的分支来:

git checkout -b serverfix origin/serverfix(这会得到一个serverfix本地分支,其内容同远程分支origin/serverfix一致)

 

43.跟踪分支

跟踪分支是一种和远程分支有直接联系的本地分支,在克隆仓库时,git会自动创建一个master分支来跟踪origin/master,这正是git pull 和 git push一开始就能正常工作的原因。

git checkout -b [分支名] [远程名]/[分支名]

 

44.衍合

 

 

通过在C3产生的变化补丁重新在C4的基础上打一遍。
git checkout experiment
git rebase master
原理:回到两个分支(你所在的分支和你想要衍合进去的分支)的共同祖先,提取你所在分支每次提交时产生的差异(diff),把这些差异分别保存到临时文件里,然后从当前分支转换到你需要衍合入的分支,依序施用每一个差异文件。

现在可以回到master分支然后进行一次快速合并

体现:比方说,某些项目自己不是维护者,但想帮点忙,就应该尽可能使用衍合,先在一个分支里进行开发,当准备向主项目提交补丁的时候,再把它衍合到origin/master里面。这样维护者就不需要做任何整合工作,只需根据你提供的仓库地址作一次快进,或者采纳你提交的更改。

45.更多有趣的衍合

git rebase --onto master server client

等于说“检出client分支,找出client分支和server分支的共同祖先之后的变化,然后把它们在master上重演一遍”。

现在可以快进master分支:
git checkout master
git merge client
继续合并server 分支,可以直接把server分支衍合到master而不用手工转到server分支再衍合。
git rebase master server
git rebase [主分支] [特性分支]

快进主分支master:
git checkout master

git merge server

现在可以删除这两个分支:

git branch -d client

git branch -d server
 
永远不要衍合那些已经推送到公共仓库的更新(如果把衍合当作一种在推送之前清理提交历史的手段,而且仅仅衍合那些永远不会公开的commit,那就不会有任何问题)。 

46.指定文件不在git管理的范围内(取消跟踪的文件)
git update-index --assume-unchanged filename

47.git协议
git可以使用四种重要的协议来传输数据:本地传输、SSH协议、HTTP协议和GIT协议,除了HTTP协议之外,其他所有协议都必须在服务器上安装并运行git

48.版本库又称仓库
版本库或者仓库,英文名Repository,就是一个目录,这个目录的文件都被git管理,不管你做什么操作都会被记录,包括:增加、删除、修改、文件等,都会被记录下来,以便后来跟踪与修改相关记录,甚至被还原。
1.新建目录
2.初始化仓库 git init 新建目录路径

49.回滚
git reset HEAD^ :回滚到上第一个版本
git reset HEAD^^: 回滚到上第二个版本
git reset HEAD~n:回滚到上第n个版本

50.返回最新版本

git reflog 查看记录
git reset HEAD@{n}: 前进到最新的第n个版本

51.协议
SSH协议:同时便于读或者写的协议,也是一个验证授权的网络协议;而因为其普遍性,通常也很容易假设和使用
缺点:人们必须是能访问主机的情况,访问仓库

几个人在不公开的项目合作,仅仅一个SSH服务器和纯仓库就足够了
只读协议:Git和HTTP/S协议

52.纯仓库
git clone --bare 现有仓库名 纯仓库名.git

53.为现有仓库添加一个远程仓库
1.cd 现有仓库
2.git remote add origin 纯仓库名.git(路径,纯仓库远程路径) 

54.生成SSH公钥
ssh-keygen

55.查看没有合并的日志
git log --no-merges

56.推送本地分支
git push origin(远程仓库) local_branch:server_branch
git push url local_branch

 

57.查看某一次提交历史

git show SHA1

git show HEAD^^^ => git show HEAD~3

58.查看某一条分支
git log master..Develop(查看在Develop而不在master的提交日志)

git log --left-right master..Develop

git log Develop..master(查看在master而不在Develop的提交日志)

60.查看本地需要提交到远程库的提交
git log origin/master..HEAD

 

61.查看在分支refB而不在refA的内容

git log refA..refB

git log ^refA refB

git log refB --not refA

 

62.查看在refA或refB而不再refC的内容

git log refA refB ^refC

git log refA refB --not refC

 

63.交互式的SHELL模式

git add -i

git add --interactive

左侧带*号表示文件将被暂存,在update后面直接加入回车会把所有选中的内容暂存。

 

65.存储工作
git stash
git stash(存储列表)
git stash apply(应用最近一次的存储)

git stash apply stash@{n}(应用某一次的存储)

git stash apply --index(应用最近一次已被暂存的存储)
git stash drop stash@{n}(移除存储)
git stash pop(重新应用存储)

 

66.修改多个提交说明、重排提交(删除提交)

67.

68.核弹级选项 filter-branch

在所有提交中删除一个文件

git filter-branch --tree-filter rm -f file HEAD
在所有分支下执行
git filter-branch --index --tree-filter rm -f fileHEAD

69.全局性地更换新地址
git filter-branch --commit-filter ‘ if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ]; then GIT_AUTHOR_NAME="Scott Chacon"; GIT_AUTHOR_EMAIL="schacon@example.com"; git commit-tree "$@"; else git commit-tree "$@"; fi‘ HEAD

 

70.创建签署的含附注的标签
git config --global user.signinkey <gpg-key-id>

71.git对象(git是一套内容寻址文件系统)
git init( 创建存储和操作目录 )
git初始化objects目录之后,同时在该目录下创建了pack和info子目录
echo test content | git hash-object -w --stdin(参数-w表示hash-object命令存储(数据对象),若不指定这个参数改名该命令仅仅返回键值。--stdin指定从标准输入设备(stdin)来去读内容,若不指定这个参数则需要指定一个要存储的文件的路径
git cat-file -p SHA-1校验和

72.tree对象
所有内容以tree或blob对象存储,其中tree对象对应于UNIX中的目录,blob对象则大致答应与inodes或文件内容
git cat-file -p master^{tree}

73.创建tree对象
人为添加一个文件到暂存区域中
 git update-index --add --cacheinfo 100644 \ 83baae61804e65cc73a7201a7252750c76066a30 test.txt
文件模式100644表明这是一个普通文件,100755表示是一个可执行文件,120000表示符号链接
将暂存区域内容写入一个tree对象。无需-w参数,如果目标tree不存在,调用write-tree会自动根据index状态创建一个tree对象。
git write-tree
命令:

git write-tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579

Git cat-file -p d8329fc1cc938780ffdd9f94e0d364e0ea74f579 100644 blob 83baae61804e65cc73a7201a7252750c76066a30 test.txt



74.HEAD标记
HEAD文件就是一个指向你当前所在分支的引用标识符。这样的引用标识符,并不包含SHA-1值,而是一个指向另外一个引用的指针。
cat .git/HEAD
ref: refs/heads/master
当执行git commit命令,它就创建了一个commit对象,把这个commit对象的父级设置为HEAD指向的引用的SHA-1值
手动更新
git symbolic-ref HEAD
git symbolic-ref HEAD refs/heads/Pankai

75.数据恢复


这样就丢弃了最新的两个commit -- 包含这两个commit的分支不存在了,可以使用git reflog工具
git reflog

git branch recover-branch ab1afef
这样就有一个跟原来一样的recover-branch分支,最新的两个commit又找回来了

76.直接恢复文件到某个版本
git ref SHA-1 file_path

Git常用命令