首页 > 代码库 > 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 file’HEAD
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常用命令