根据网络资源进行整理,记录的比较详细方便自己日后查看。以下列举的命令可以在项目目录打开GitBash使用,也可以在AndroidStudio或者IntelliJ等支持Git的IDE中使用。
基础概念Repositiry
在版本管理中,Repository翻译过来就是仓库的意思,每个提交到本地,或者PUSH到远程服务器的 Project,被 Github以数据结构的形式保存,而这个数据结构被称为 Repository 即仓库。
配置用户信息(config命令)
配置个人用户名和邮件地址,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新
$ git config --global user.name “youname”
$ git config --global user.email “12345@example.com”
如果用了 --global
选项,那么更改的配置文件位于你用户主目录下,以后所有项目都默认使用这里配置的用户信息。如果要在某个特定项目中使用其他名字或者电邮,只要去掉 --global
选项重新配置即可,新设定保存在当前项目的 /.git/config
文件里。
命令输入的自动补全功能,输入命令后按tab键,就会看到列出所有匹配的可用命令建议:
$ git co<tab>
提交(commit)推送(push)与拉取(pull)
初始化一个本地仓库:
$ git init
初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。不过目前,仅仅是按照既有的结构框架初始化好了里边所有的文件和目录,但我们还没有开始跟踪管理项目中的任何一个文件
$ git init –-bare
初始化加上--bare参数后会建立一个以分享/分布式开发为目的的纯粹服务器仓储,而 git init
或者 git clone
都是建立(或拷贝)一个本地的开发工作目录。
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add
命令对这些文件进行跟踪,然后提交:
跟踪文件:(将文件加到暂存区域)
$ git add <filename>
跟踪全部文件:
$ git add .
提交(commit)更新:通过commit命令提交至本地仓库中,每一次commit都意味着版本在进行一次更新。
$ git commit -m "commit-desc"
注意commit只是将修改提交到本地的仓库,并没有更新服务器。
如果觉得暂存区繁琐,$ git commit -a
命令会自动把所有已经跟踪的文件暂存起来一并提交,从而省略 git add
步骤。
移除文件:(remove),只能移除一个文件
$ git rm <filename>
如果需要移除 abc 目录下的所有文件,则可以用递归移除命令,加 -m 参数,如下:
$ git rm -m abc/*
重命名文件:(rename)
$ git mv oldname.txt newname.txt
推送(PUSH)数据到仓库:
$ git push [remote-name] [branch-name]
比如,将本地[master]分支推送(push)到Github服务器[origin]分支(说明下:克隆操作会自动使用默认的master 和origin 名字),可以运行下面的命令:
$ git push origin master
获取远程分支的最新版本(修改)到本地有两种方式:
$ git pull <remote-name>
从远程获取最新版本到地,并且会自动merge!
$ git fetch <remote-name>
从远程获取最新版本到地,不会自动merge,并且 $ git fetch
可得到远程代码仓库中本地没有的分支
添加与克隆远程仓库
把仓库从远程服务器克隆到本地:(三种方式)
$ git clone git://github.com/youname/project.git
$ git clone git@github.com:youname/project.git
$ git clone https://github.com/youname/project.git
这时可以使用 ls -al
命令查看目录文件列表,命令如下:
$ ls -al
/.git目录: 把仓库克隆到本地后在工作目录下会有一个默认隐藏的 .git目录,就是Git仓库。其中存放的是我们所提交的文档索引内容,Git基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本控制。.git目录位于工作目录内。
创建 [.gitignore] 文件:
$ touch .gitignore
/.gitignore文件用于配置git忽略文件规则。项目中有很多文件不必使用git管理,例如Eclipse或其他IDE生成的项目文件,编译生成的各种目标或临时文件等。使用git status时,会在Untracked files里面看到这些文件列表。在文件.gitignore中配置规则来告诉git把这些文件忽略。支持通配符,例如:
*.a #忽略所有以.a为后缀的文件;
!lib.a #不忽略文件lib.a;
/TODO #只忽略此目录下TODO文件,子目录的TODO不被忽略;
build/ #忽略build目录下的所有文件;
doc/*.txt #只忽略doc/下所有的txt文件,但是不忽略doc/subdir/下的txt文件
对于已经加入到索引的应该忽略的文件,使用命令将要忽略的文件从索引中删除:
$ git rm --cached filename
或者
$ git update-index --force-remove foo.class
向远程服务器添加仓库:(远程仓库必须先在github上建好)
$ git remote add [shortname] [url]
例如:$ git remote add origin git@github.com:youname/yourRepo.git
碰到远端仓库服务器迁移,或者原来的克隆镜像不再使用,又或者某个参与者不再贡献代码,那么需要移除对应的远端仓库
远程仓库的删除:
$ git remote rm <repo-name>
远程仓库重命名,从
$ git remote rename <from-name> <to-name>
状态(status)和日志(log)
查看配置信息:查看已有的配置信息
$ git config --list
$ git config -l
获取帮助:例如想获取config命令的帮助信息
$ git help config
$ git config --help
检查当前文件状态:
$ git status
查看提交日志:(默认不使用任何参数,会按时间列出所有更新,最近的更新排在最上面)
$ git log
我们常用 -p 命令展开显示每次提交的内容差异,用 -2 命令则仅显示最近两次更新:
$ git log -p -2
另外 --stat 命令仅简要的显示文件增改行数统计,每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计:
$ git log --stat
另外 --author 命令仅显示指定作者相关的提交:(查找 author 提交的版本)
$ git log --author=author
查看HEAD信息
HEAD可以理解为一个指针,每次都指向当前分支的最后一次信息(commit或者pull),通过移动HEAD可以切换分支;如果当前分支在master,那么HEAD信息可以用下图表示:
查看当前的HEAD信息:
$ cat .git/HEAD
Diff命令:比较差异
显示工作目录与暂存区文件的差异(修改之后还没有暂存起来的变化内容),不加参数:
$ git diff
(show diff of unstaged changes.)
显示暂存区与上次提交的git仓库之间的差异:
$ git diff --cached
(show diff of staged changes. Git 1.6.1 及更高版本还允许使用 $ git diff --staged,效果是相同的).
比较工作区和上次提交之间所有的改动:
$ git diff HEAD
$ git diff HEAD^ 比较上次提交,HEAD^也就是HEAD~1
$ git diff HEAD~2 比较上2次提交
(show diff of all staged or unstated changes.)
使用图形工具显示文件之间的差异:
git difftool
列出文件列表,显示差异:
git diff --stat
比如,获得两个版本间所有变更的文件列表:
git diff --name-status HEAD~2 HEAD~3
只对比给定的文件
git diff -- filename
历史提交对比可用下列命令
比较当前工作目录与指定版本改动:
$ git diff <version-tag>
跟log命令一样,diff也可以加上--stat
参数来简化输出:
$ git diff <version-tag> --stat
比较两次提交版本(或者两个分支)的内容改动:
$ git diff <version-tag-1> <version-tag-2>
等价于
$ git diff <version-tag-1>..<version-tag-2>
如果省略任意一个<version-tag>
,默认将使用HEAD
代替。其中,<version-tag>
可以是简写的commit哈希值,也可是是HEAD
。其中HEAD
代表最后一次提交,HEAD^
代表最后一次提交的父提交,HEAD~1
等价于HEAD^
,HEAD~2
为倒数第二次提交,以此类推。
GIT分支:可以很方便的创建新分支,在新分支上解决问题,完成测试后将新分支合并到master分支
查看当前分支:(当前分支默认为 master
分支)
$ git branch
查看本地和远程的所有分支:
$ git branch -a
查看各个分支最后一个提交对象的信息:
$ git branch -v
创建一个名为“testing”的新分支:
$ git branch <branch-name|testing>
切换到“testing”分支(创建完成后,当前所在分支为 master
分支,当前分支一般会有 * 标示):
$ git checkout testing
新建并切换到新分支(和以上两个命令的效果相同):
$ git checkout -b <branch-name>
这条命令相当于执行下面这两条命令:
$ git branch <new-branch>
$ git checkout <new-branch>
从A分支创建并切换到B分支,可以这样写(如果不写<branch-A>
则默认从当前分支创建并切换到B分支):
$ git branch -b <branch-B> <branch-A>
删除hotfix分支:(如果该分支还未被合并则会提示错误,因为这样会丢失数据)
$ git branch -d hotfix
强制删除hotfix分支:(强制删除,不会提示错误)
$ git branch -D hotfix
推送本地分支到远程分支:
$ git push origin <local-branch>:<remote-branch>
其中,<local-branch>
为本地分支,<remote-branch>
为远程分支,若远程分支不存在则会自动创建;
类似,如果<local-branch>
留空,效果则是删除远程<remote-branch>
分支,命令如下:
git push origin :<remote-branch>
切换到远程分支:
$ git checkout remotes/origin/<branch-name>
合并分支
把<branch>
分支的代码合并到master
分支:(需要先切换到master
分支,再执行merge)
$ git checkout master
$ git merge <branch>
合并代码冲突:当合并代码时经常会出现冲突,也可能出现在从远程仓库pull仓库时。可先用 $ git status 检查冲突状态,解决问题(比如使用AndroidStudio的Compare试图进行对比分析)后再合并,比如:
<manifest>
<application>
android:label="demo"
<<<<<<< HEAD
android:icon="@drawable/app_icon"
=======
android:theme="@style/AppTheme"
>>>>>>> [remote-branch]
</application>
</manifest>
注意:<<<<<<<
与=======
中间的内容是当前用户工作目录的修改,而=======
与>>>>>>>
中间内容是远程分支[remote-branch]别人提交的修改
查看已经与当前分支合并的分支:(已经合并的查出来后可以删掉)
$ git branch --merge
查看未与当前分支合并的分支:
$ git branch --no-merged
rebase
也是合并命令,rebase
和merge的区别是,合并后节点信息不一样,如下图所示:
同步远程服务器数据到本地:
$ git fetch origin
从新添加的远程仓库下载数据:
$ git remote add teamone git://git.team1.ourcompany.com
$ git fetch teamone
分化一个新的分支:(使用这个命令会从服务器上下载master最新的版本,所以如果当前本地版本不是最新的,新的分支和本地分支会不同)
$ git checkout -b test1 origin/master
假如你用这个新的分支进行git push,并且通过了合并,那么会在远程仓库建立一个新的同名分支,删除该分支:
$ git push origin :test1
衍合(这个比较高级)
根据当前分支(也就是要进行衍合的分支test1)后续的历次提交对象(这里只有一个 C3),生成一系列文件补丁,然后以主干分支master
最后一个提交对象(C4)为新的出发点,逐个应用之前准备好的补丁文件,最后会生成一个新的合并提交对象(C3'),从而改写 test1 的提交历史,使它成为master
分支的直接下游:
分支的衍合:将test1分支衍合到master
主分支
$ git checkout test1
$ git rebase master
另一种方法,直接衍合,不用再先切换到test1
$ git rebase master test1
快进master分支
$ git checkout master
$ git merge client
注意衍合:一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。
版本回退(reset)
一般在版本回退之前会先用 $ git status
命令查看当前状态:
$ git status
后退操作reset:(回档某个文件,比如文件
HEAD
信息可通过
$ git log
命令查看)
$ git reset HEAD <filename>
储藏(Stash)
为完成一项紧急需求需要切换到其他分支,而你正在做的工作处于比较杂乱的状态,此时就可以储藏,使用命令:
$ git stash
查看所有储藏:
$ git stash list
重新应用指定储藏:(如不指定 stash@{o} ,则默认应用最近stash)
$ git stash apply stash@{o}
删除指定储藏:
$ git stash drop stash@{o}