GIT笔记

Git命令

git config --listgit config --global user.name/email

配置全局用户名/邮箱

git config --list

查看所有配置项

git init

可以用以下linux命令新建一个文件,当然也可以到文件管理器里手动新建:
$ mkdir learngit//新建文件
$ cd learngit//打开文件
$ pwd//显示当前目录
/Users/michael/learngit

进入需要新建repo的文件夹,执行下面命令

$ git init

在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个repo,并在当前文件夹下创建一个.git文件夹.

git clone

获取一个url对应的远程Git repo, 创建一个local copy.

一般的格式是git clone [url].

clone下来的repo会以url最后一个斜线后面的名称命名,创建一个文件夹,如果想要指定特定的名称,可以git clone [url] newname指定.

git status

列出当前目录所有还没有被git管理的文件和被git管理且被修改但还未提交(git commit)的文件

git status -uno可以只列出所有已经被git管理的且被修改但没提交的文件
git status -s -s表示short, -s的输出标记会有两列,第一列是对staging区域而言,第二列是对working目录而言.

git add

在提交之前,Git有一个暂存区(staging area),可以放入新添加的文件或者加入新的改动. commit时提交的改动是上一次加入到staging area中的改动,而不是我们disk上的改动.

git add . 会递归地添加当前工作目录中的所有文件.

git commit

提交已经被add进来的改动.

git commit -m '提交说明'

git commit -a 会先把所有已经track的文件的改动add进来,然后提交(有点像svn的一次提交,不用先暂存). 对于没有track的文件,还是需要git add一下.
可以-a的同时可以-m:

$ git commit -a -m '提交说明'

git commit --amend 有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,可以使用 --amend 选项重新提交:

$ git commit --amend

此命令将使用当前的暂存区域快照提交。如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,但将要提交的文件快照和之前的一样。

启动文本编辑器后,会看到上次提交时的说明,编辑它确认没问题后保存退出,就会使用新的提交说明覆盖刚才失误的提交。

如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 --amend 提交:

$ git commit -m '提交说明'
$ git add forgotten_file
$ git commit --amend

上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。

git log

show commit history of a branch.

git log --oneline --number: 每条log只显示一行,显示number条.

git log --oneline --graph:可以图形化地表示出分支合并历史.

git log branchname可以显示特定分支的log.

git log --oneline branch1 ^branch2可以查看在分支1,却不在分支2中的提交.表示排除这个分支(Window下可能要给branch2加上引号).

git log --decorate会显示出tag信息.

git log --author=[author name] 可以指定作者的提交历史.

git log --since --before --until --after 根据提交时间筛选log.
--no-merges可以将merge的commits排除在外.

git log --grep 根据commit信息过滤log

git log --grep=keywords
默认情况下, git log --grep --author是OR的关系,即满足一条即被返回,如果你想让它们是AND的关系,可以加上--all-match的option.

git log -S: filter by introduced diff.

比如: git log -SmethodName (注意S和后面的词之间没有等号分隔).

git log -p: show patch introduced at each commit.

每一个提交都是一个快照(snapshot),Git会把每次提交的diff计算出来,作为一个patch显示给你看.
另一种方法是git show [SHA].

git log --stat: show diffstat of changes introduced at each commit.
同样是用来看改动的相对信息的,--stat比-p的输出更简单一些.

对比 git diff

不加参数的$ git diff:
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容.(工作区和暂存区之间的差异)

若要看已经暂存起来的文件和上次提交时的快照之间的差异(暂存区和版本库),可以用:

$ git diff --cached

(Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相同的).

比较woking directory和上次提交之间所有的改动(工作区和版本库),可以用:

//效果一样:
$ git diff 分支名
$ git diff HEAD

如果想比较两个分支的差异,可以用:

$ git diff 分支1..分支2
# 或者
$ git diff 分支1 分支2

$ git diff master..test

上面第五行这条命令只显示两个分支间的差异,如果你想找出‘master’,‘test’的共有 父分支和'test'分支之间的差异,你用3个‘.'来取代前面的两个'.' 。

$ git diff master...test

如果想看自从某个版本之后都改动了什么,可以用:

$ git diff [version tag]

跟log命令一样,diff也可以加上--stat参数来简化输出.

撤销

$ git reset HEAD

这个命令用来把不小心add进去的文件从staged状态取出来(暂存区退回工作区),可以单独针对某一个文件操作: git reset HEAD - - filename, 这个- - 也可以不加.
这里的HEAD可以被写成任何一次提交的SHA-1(commit_id).


$ git checkout -- filename

把文件在工作区的修改全部撤销,这里有两种情况:

  1. 一种是文件自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
  2. 一种是文件已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令;


有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,可以使用 --amend 选项重新提交(同时可以备注):

$ git commit - m "提交说明"--amend

此命令将使用当前的暂存区域快照提交,有两种情况:

  1. 如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,但将要提交的文件快照和之前的一样。
  2. 如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 --amend 提交
$ git commit -m '提交说明'
$ git add filename
$ git commit --amend

上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。

恢复

误删误操作后想恢复到之前的版本可以用下面的方法:

git checkout commit_id filename

这个方法可以恢复到对应版本的指定文件

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。


如果想要把对应版本的所有文件都恢复,用下面的方法:

$ git reset --hard commit_id

也可以通过操作HEAD的指向来实现:

$ git reset --hard HEAD^//退回到上一个版本
$ git reset --hard HEAD^^//退回到上上一个版本
$ git reset --hard HEAD~3//退回到上三个版本
$ git reset --hard HEAD~4//退回到上四个版本

退回以前的版本后,git log里只能看到当前版本往前的版本了,但是如果想恢复当前版本往后的版本呢?可以用下面的方法查看所有提交过的版本commit_id:

$ git reflog

删除git rm

git rm filename:当在工作区删除了文件时,执行这句可以把对应在暂存区的文件删除.

注意$ rm filename前面没有git,就等于直接在文件管理器中把文件删了

git rm -f filename: 从staging区移除文件,同时也移除出工作目录.

git rm --cached filename: 从staging区移除文件,但留在工作目录中.

git rm --cached从功能上等同于git reset HEAD,清除了缓存区,但不动工作目录树

同步到远程仓库

配置好后:

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

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

注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。

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

$ git push origin master

上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。

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

$ git push origin :master
# 等同于
$ git push origin --delete master

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

$ git push origin

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

$ git push

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

$ git push -u origin master

上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。

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

$ git config --global push.default matching
# 或者
$ git config --global push.default simple

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

$ git push --all origin

上面命令表示,将所有本地分支都推送到origin主机。

如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用--force选项。

$ git push --force origin 

上面命令使用--force选项,结果导致远程主机上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用--force选项。

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

$ git push origin --tags

$ git remote可以列出已经存在的远程分支;

带参数-v列出详细信息,在每一个名字后面列出其远程url;

$ git remote add [shortname] [url]可以添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用;


Git中从远程的分支获取最新的版本到本地有2个命令:

  1. git fetch相当于是从远程获取最新版本到本地,不会自动merge;
  2. git pull命令是取回远程主机某个分支的更新,再与本地的指定分支合并;
$ git fetch <远程主机名>

上面命令将某个远程主机的更新,全部取回本地;

git fetch命令通常用来查看其他人的进程,因为它取回的代码对你本地的开发代码没有影响。
默认情况下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。

$ git fetch <远程主机名> <分支名>

所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取。比如origin主机的master,就要用origin/master读取。

git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支。

$ git branch -r
origin/master

$ git branch -a
* master
  remotes/origin/master

上面命令表示,本地主机的当前分支是master,远程分支是origin/master
取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支。

$ git checkout -b newBrach origin/master

上面命令表示,在origin/master的基础上,创建一个新分支。
此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支

$ git merge origin/master
# 或者
$ git rebase origin/master

上面命令表示在当前分支上,合并origin/master

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

如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
实质上,这等同于先做git fetch,再做git merge。


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

Git也允许手动建立追踪关系。

$ git branch --set-upstream master origin/next

上面命令指定master分支追踪origin/next分支。
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名

$ git pull origin

上面命令表示,本地的当前分支自动与对应的origin主机"追踪分支"(remote-tracking branch)进行合并。
如果当前分支只有一个追踪分支,连远程主机名都可以省略。

$ git pull

上面命令表示,当前分支自动与唯一一个追踪分支进行合并。

如果合并需要采用rebase模式,可以使用--rebase选项。

$ git pull --rebase <远程主机名> <远程分支名>:<本地分支名>

如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。

但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。

$ git pull -p
# 等同于下面的命令
$ git fetch --prune origin 
$ git fetch -p

分支

git branch不带参数:列出本地已经存在的分支,并且在当前分支的前面加“*”号标记

git branch -r 列出远程分支

git branch -a 列出本地分支和远程分支

git branch branchname创建一个新的本地分支,需要注意,此处只是创建分支,不进行分支切换

git branch -m oldbranch newbranch 重命名分支,如果newbranch名字分支已经存在,则需要使用-M强制重命名,否则,使用-m进行重命名

git branch -d branchname 删除branchname分支,-M强制删除
一般分支合并到master后就可以删除掉;
git branch -d -r branchname 删除远程branchname分支

创建了一个新分支,需要用git checkout branchname切换到新分支,当然也可以用git checkout -b branchName命令同时创建和切换;

最后可以用git merge进行合并分支;
如果两个分支修改了同一个文件的同一块区域,GIT会报告内容冲突
这时应该先编辑冲突,然后git commit -a提交或者运行 git add 将把它们标记为已解决状态(实际上就是来一次快照保存到暂存区域)。因为一旦暂存,就表示冲突已经解决。
注:对于git来讲,编辑冲突跟平时的修改代码没什么差异。修改完成后,都是要把修改添加到缓存,然后commit。

如果想看一下哪些分支已经(或尚未)与当前分支合并的分支,可以用 –merge –no-merged 参数

posted @ 2017-05-05 17:55  CHENJIAJIE  阅读(106)  评论(0编辑  收藏  举报