基本操作
//拉取远端分支到本地分支:
git pull origin <remote_branch>
//push本地分支到远端分支:
git push origin <local_branch>:<remote_branch>
//提交改动到本地分支:
git commit -am "comments"
//新建branch,基于当前branch
git branch <branch_name>
//从远端分支拉取创建本地分支:
git checkout -b <local_branch> origin/<remote_branch>
//回退到某一个版本,如果不指定<commit>,默认就是HEAD
git reset --soft <commit> 撤销commit,保留workingtree、index file
git reset --mixed <commit> 撤销commit、index file,保留working tree
git reset --hard <commit> 撤销commit、index file、working tree
//放弃当前所做的所有更改:
git reset --hard
diff的用法
working tree:工作目录,就是当前操作的源代码文件。
index file:索引文件,它是连接working tree和commit的桥梁,当使用git -add命令来登记后,index file的内容就改变了,此时index file就和working tree同步了。
需要注意的是,在add过之后所做的改动,需要再次add之后才能加入index file。
commit是最后的阶段,就是将index file里的内容提交到git仓库中。
总结一下:
git diff 查看working tree与index file的差别。
git diff --cached 查看index file与git仓库的差别。
git diff HEAD 查看working tree和git仓库的差别。
//从index file中移除登记过的文件
git reset --mixed <file1> <file2>
//将working tree恢复成index file的状态。
git checkout <file1> <file2>
//比较两个branch
diff <branch_A>..<branch_B>
merge的用法
//将<branch_name>分支merge到当前分支,--squash表示不需要merge<branch_name>分支所有的commit log
git merge --squash <branch_name>
当merge无法解决冲突的时候,它会给用户提供冲突信息,用户必须自己解决这些问题。
未发生冲突的代码已经被添加到index file里了。如果你这个时候使用git diff,显示出来的只是发生冲突的信息。
在解决冲突之前,如果使用git commit提交的话,git会提示:
<filename> needs merge
在发生冲突的时候,如果使用git status命令,会显示发生冲突的具体信息。
在解决了冲突之后,可以使用如下步骤来提交:
第一步:git add <filename>
第二步:git commit
patch的用法
//创建当前分支和<branch_name>分支的patch
git format-patch <branch_name> --stdout > ~/review.patch
git的提示信息
如果git提示说“changed but not updated”,表示在working tree已经做修改,但还没有使用git add登记到index file里。
如果git提示说“Changes to be committed”,表示已经存在于index file里,但尚未git commit提交。
如果git提示说“Untracked files”,那么就是你增加了新文件。
HEAD:表示最近一次的commit。
HEAD^:表示HEAD父母的信息
HEAD^^:表示HEAD父母的父母的信息
HEAD~4:表示HEAD上溯四代的信息
MERGE_HEAD:如果是merge产生的commit,那么它表示除HEAD之外的另一个父母分支。
配置图形化diff工具meld :
安装:sudo apt-get meld
配置为git的diff工具:
git config --global diff.external meld
之后进行diff操作,meld 会被调用,但是会出现错误"Wrong number of arguments (Got 7)"。原因是git 会传递7 个参数给meld ,但是meld 只需要两个参数,所以必须要做一点小修改,在用户目录下建立一个git-meld.sh 的script:
vi ~/git-meld.sh
加入以下内容:
#!/bin/sh
meld $2 $5
改变git-meld.sh的属性:
chmod 777 ~/git-meld.sh
最后重新设定:
git config --global diff.external~/git-meld.sh
搞定!
.gitconfig的配置
可以修改用户目录下的.gitconfig文件,自定义git命令,少敲几个字符,懒人的最爱,而且还有一些其它的有空配置:
[user]
name= edisonlg
email= edisonlg@gmail.com
[color]
ui= auto
status= auto
branch= auto
[diff]
external= /home/ligang/bin/git-meld.sh
[alias]
co= checkout
ci= commit -am
st= status
br= branch
onedaylog= log --pretty=oneline --since='1 day ago'
twodaylog= log --pretty=oneline --since='2 days ago'
oneweeklog= log --pretty=oneline --since='1 week ago'
patch4review = diff HEAD > ~/review.patch
.gitignore的配置
.gitignore即可以放在当前的工程目录,只针对当前的工程有效,也可以通过下面的方法配置一个全局的设置:
可以修改用户目录下的.gitignore文件,来添加不需要git进行版本管理的文件:
git config --global core.excludesfile ~/.gitignore
实际上执行上述命令之后,可以在~/.gitconfig文件中发现多了下面一行:
[core]
excludesfile = /home/ligang/.gitignore
.gitignore的语法使用标准的glob模式匹配。
#为注释行
斜杆/结尾的字符,被当做文件夹处理,文件夹下的所有文件将被忽略。
glob语法
* [abcd] ? [0-9a-zA-Z] \
匹配任意字符 匹配多种可能 匹配单个字符 匹配一个范围 转义字符
例如,我们使用Eclipse时,会产生很多工程文件,不需要git进行版本控制,.gitignore的内容就如下:
======================
.classpath
.project
.settings
bin # bin文件夹下都忽略
gen # gen文件夹下都忽略
project.properties
default.properties
=====================