PRELOADER

本站基于Hexo创建,收藏java相关技术文档。

当前文章 : 《git常用命令集》

3/18/2019 —— 

@TOC

本文只用来记录git常用命令集,以备查询,不做更多介绍,git学习参见官网。命令中的文字说明,有
一些是自己的理解。

git命令

基础

git init

用于本地安装好git之后,在任何一个目录下使用此命令,可以将此目录初始化为一个git仓库。命令后加上–bare,可以将改目录初始化为一个没有工作区的专用仓库,常用于搭建私有仓库。

$ git init
$ git init --bare

git add

跟踪文件,将文件添加至暂存区。新增的、被修改过的、冲突合并后都需要add至暂存区。

$ git add HelloWorld.java

git commit

提交,此命令会打开一个文本文档界面,输入提交备注后提交。-m用于输入提交说明。-a用于跳过暂存区,即不需要git add,修改后直接commit,会将工作区所有文件的修改提交。

$ git commit -m '首次提交至git'
$ git commit -a -m '上传BUG修复提交'

git status

查看工作区文件状态

$ git status

git diff

比较当前文件和文件快照的差异,即文件修改后还未git add至暂存区时候的差异。

$ git diff HelloWorld.java

查看当前文件和git add至暂存区已经缓存起来的文件之间的差异

$ git diff --staged HelloWorld.java

同git diff –staged

$ git diff --cached HelloWorld.java

删除、移动

git rm

删除,将文件从暂存区和工作区彻底移除

$ git rm HelloWorld.java

git rm –cached filename

将文件从暂存区删除,但是工作区保留

$ git rm --cached HelloWorld.java

git mv

移动文件,将文件移动到指定位置

$ git mv /path/HelloWorld.java /new/path/HelloWorld.java

日志查看

git log

查看日志,可以显示由最近到之前的提交历史,包括提交ID、作者、日期、提交备注信息。

[root@izj6c2tb3z4s8qk26s03bfz blog]# git log
commit 23863e87df28a5f1cbe49927b8a64cfe4e10bf94
Author: tth <31264370+tthz@users.noreply.github.com>
Date:   Wed Nov 14 11:18:32 2018 +0800

    Delete _config.yml

commit 51539b6ff9117b1bcea6b6ecfa2d63ba9ad982a0
Author: mydr <31264370+mydr@users.noreply.github.com>
Date:   Sat Sep 22 13:08:31 2018 +0800

    Set theme jekyll-theme-cayman

git log 后加上 - 数字,数字是几, 则显示最近几次的日志。

[root@izj6c2tb3z4s8qk26s03bfz blog]# git log -2
commit eae6dabd1921a8d862059db12e7c98a0ca71d245
Author: tth <397244215@qq.com>
Date:   Wed Nov 14 12:04:30 2018 +0800

    配置修改提交

commit eb436e5472136e8e5157f695977a3e4fc5d69b7d
Author: tth <397244215@qq.com>
Date:   Wed Nov 14 11:37:47 2018 +0800

    静态页面首次生成

git log –pretty = oneline

使用这个命令之后,只显示提交ID和备注信息。

[root@izj6c2tb3z4s8qk26s03bfz blog]# git log --pretty=oneline
8155a5a075a5d565874933b57cb7cfa43985f04d Delete index.md
23863e87df28a5f1cbe49927b8a64cfe4e10bf94 Delete _config.yml
51539b6ff9117b1bcea6b6ecfa2d63ba9ad982a0 Set theme jekyll-theme-cayman

git log –oneline –decorate

查看各个分支当前所指的对象,该功能主要由–decorate提供

git log –online –decorate –graph –all

查看各个分支指向的提交对象历史,各种参数组合查询官网

$ git log --graph --pretty=oneline --abbrev-commit
*   cf810e4 (HEAD -> master) conflict fixed
|\  
| * 14096d0 (feature1) AND simple
* | 5dc6824 & simple
|/  
* b17d20e branch test
* d46f35e (origin/master) remove test.txt
* b84166e add test.txt
* 519219b git tracks changes
* e43a48b understand how stage works
* 1094adb append GPL
* e475afc add distributed
* eaadf4e wrote a readme file

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

自定义格式显示,format之后的格式可以参考官网自定义。

[root@izj6c2tb3z4s8qk26s03bfz blog]# git log --pretty=format:"%h - %an, %ar : %s"
8155a5a - tth, 25 hours ago : Delete index.md
23863e8 - tth, 25 hours ago : Delete _config.yml
51539b6 - mydr, 8 weeks ago : Set theme jekyll-theme-cayman

git reflog

查看历史命令

[root@izj6c2tb3z4s8qk26s03bfz blog]# git reflog
eae6dab HEAD@{0}: commit: 配置修改提交
eb436e5 HEAD@{1}: commit: 静态页面首次生成
6ac7cec HEAD@{2}: commit: 个人博客首次提交
8155a5a HEAD@{3}: checkout: moving from master to master
8155a5a 

撤销、版本回退

git commit –amend

覆盖之前的那次提交。刚刚提交,发现有一个文件有问题,立即再次提交。

$ git commit --amend -m "重新提交"

git checkout –

撤销对filename文件的修改,仅限于还未add到暂存区的时候。既然还未add,同时你还记得改了哪些,也可以手动改回去。

$ git checkout -- HelloWorld.java

git reset HEAD

撤销将filename文件add到暂存区的操作,还原到工作区的已修改但未add的状态。即撤销对HelloWorld.java文件的add操作。这种操作针对我们修改了文件并git add操作之后。

$ git reset HEAD HelloWorld.java

git reset –hard HEAD^

回退到上一个版本,一个^代表后退一步,两个代表两步,以此类推。此操作会将工作区所有文件回退至上一个哈希版本

$ git reset --hard HEAD^

git reset –hard

回退到指定的版本,在–hard后输入指定版本的ID。

$ git reset --hard eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0

总结:checkout、reset HEAD、reset –hard分别对应为add、已add、已commit的撤销
checkout其实就是告诉git,用版本库里的覆盖工作区的内容

远程仓库的使用

git remote

查看已经配置的远程仓库

[root@izj6c2tb3z4s8qk26s03bfz blog]# git remote
origin

git remote -v

显示需要读写的远程仓库的简写以及仓库的url

[root@izj6c2tb3z4s8qk26s03bfz blog]# git remote -v
origin  git@github.com:tthz/tthz.github.io.git (fetch)
origin  git@github.com:tthz/tthz.github.io.git (push)

git ls-remote

查看远程引用分支列表

[root@izj6c2tb3z4s8qk26s03bfz hexo-theme-Annie]# git ls-remote
From https://github.com/Sariay/hexo-theme-Annie.git
af2ba2f7dbc4e04e5ea99725a6b3ac2b83ef3049        HEAD
af2ba2f7dbc4e04e5ea99725a6b3ac2b83ef3049        refs/heads/master
5591c1fe51fb8724dac53bd0cc6f0992908ed41e        refs/pull/10/head
6199463ee908e0de1747e63866e9d5ea544daade        refs/pull/10/merge

git remote show

查看指定的远程仓库的信息

[root@izj6c2tb3z4s8qk26s03bfz blog]# git remote show origin
* remote origin
  Fetch URL: git@github.com:tthz/tthz.github.io.git
  Push  URL: git@github.com:tthz/tthz.github.io.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (local out of date)

git remote add

使用git remote时,若显示的信息为空,说明还没有关联远程仓库,可以手动为本地仓库关联一个远程仓库。

$ git remote add origin git@github.com:tthz/tthz.github.io.git

git remote rename

为关联的远程仓库重新命名

$ git remote rename origin local-origin

git remote rm

如果不需要本地关联的远程仓库了,可以删除本地的关联远程仓库,操作只针对本地仓库,不影响远程仓库。

$ git remote rm origin

git clone username@domainname:/to/repository/path

克隆仓库,将远程仓库直接克隆到本地,最后的origin就是本地的仓库名称。也可也通过git clone -o remoteName 的方式为远程仓库命名。克隆同时自动让本地仓库的master分支跟踪远程仓库的master分支。
clone是将远程仓库直接克隆到本地,remote add是将本地已有仓库与远程仓库关联
clone命令会自动为我们创建一个名为origin的仓库,表示它是一个远程仓库,拉去它的所有数据为我们在本地创建一个master分支,这样我们就有了工作的基础。在本地创建一个指向远程仓库的master分支的指针,并且将其命名为originmaster,该指针用来记录远程仓库master分支的版本信息。当我们对master的修改提交和远程仓库master分支不一样的时候,本地master就会出现新的分支。

[root@izj6c2tb3z4s8qk26s03bfz blog]# git clone git@github.com:tthz/tthz.github.io.git origin

分支

  1. 合并分支前必须先切换到发起合并的分支。如A和B,A合并掉B,需先切换到A。
  2. 合并分支前,被合并分支需要提交或者清理工作区现场
  3. 理解fast-foward合并和三方快照合并
  4. 冲突合并

    git branch

    创建分支
    [root@izj6c2tb3z4s8qk26s03bfz blog]# git branch iss1
    

git checkout

切换到新分支

[root@izj6c2tb3z4s8qk26s03bfz blog]# git checkout master
Switched to branch 'master'

git checkout -b

创建一个新分支并切换到新分支上

[root@izj6c2tb3z4s8qk26s03bfz blog]# git checkout -b iss2
Switched to branch 'iss2'

git merge

合并分支

[root@izj6c2tb3z4s8qk26s03bfz blog]# git merge iss2
Updating d46f35e..b17d20e
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)

git branch -d

删除不需要的name分支,只能删除已经合并的分支,未合并的删除会失败。

[root@izj6c2tb3z4s8qk26s03bfz blog]# git branch -d iss2
Deleted branch iss1 (was eae6dab).

git branch –merged

显示已经合并的分支,被合并的分支可以删除。

[root@izj6c2tb3z4s8qk26s03bfz blog]# git branch --merged
Deleted branch iss1 (was eae6dab).

git branch –no-merged

显示尚未合并的分支,因为未被合并,为防止修改丢失,直接删除会提示删除失败。

[root@izj6c2tb3z4s8qk26s03bfz blog]# git branch --no-merged

远程分支

上面讲到过远程仓库,远程分支与远程仓库时紧密相连的。

git checkout -b

当我们利用git fetch从服务器抓取到数据后,服务器不会为我们创建本地分支,所以没有可编辑的本地分支serverfix,
只有一个指向这个远程仓库分支的指针。
利用checkout从远程仓库分支检出一个本地分支,并隐式跟踪该远程仓库分支。即本地分支从创建开始就跟踪远程分支。

[root@izj6c2tb3z4s8qk26s03bfz blog]# git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

git checkout –track

从远程仓库分支检出一个本地分支,并显式跟踪远程仓库分支。即本地分支从创建开始就跟踪远程分支。

[root@izj6c2tb3z4s8qk26s03bfz blog]# git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

git branch –set-upstream-to 和 git branch -u

这两个命令都表示将当前本地分支与某个远程分支关联起来。但是不论从理解上还是使用上,后者都更简洁明了。

[root@izj6c2tb3z4s8qk26s03bfz blog]# git branch -u origin/serverfix
Branch 'serverfix' set up to track remote branch 'serverfix' from 'origin'.
[root@izj6c2tb3z4s8qk26s03bfz blog]# git branch --set-upstream-to=origin/dev dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.

git push origin –delete /branch

删除一个远程分支

[root@izj6c2tb3z4s8qk26s03bfz blog]# git push origin --delete serverfix
To https://github.com/schacon/simplegit
 - [deleted]         serverfix

git branch -vv

查看本地仓库所有的跟踪分支

[root@izj6c2tb3z4s8qk26s03bfz blog]# git branch -vv
  iss53     7e424c3 [origin/iss53: ahead 2] forgot the brackets
  master    1ae2a45 [origin/master] deploying index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
  testing   5ea463a trying something new

git fetch

自动查找origin是哪一个服务器,从中抓取本地没有的数据更新到本地,移动originmaster指针指向新的更新后的位置。该操作不存在合并动作,如果fetch时发现本地数据不一样,会出现新的分支。注意与git pull的区别。

$ git fetch origin

git pull

适用于一一对应的跟踪分支,拉去远程仓库的数据后会自动合并,相当于git fetch和git merge的合并。

[root@izj6c2tb3z4s8qk26s03bfz blog]# git pull

git push -u

将本地数据推送到远程仓库。带-u的推送,git会自动将本地的master分支和远程仓库的分支关联起来,即一一对应跟踪,以后更新这个分支的数据,只需要使用gitpull。推送时候,如果本地分支名称和远程分支不一样,需要通过冒号区分,冒号前为本地分支名,后面为远程分支名称。
比如通过git remote add命令添加的远程仓库,还没设置过让本地分支跟踪远程仓库分支,可以在推送的时候直接用此参数。

[root@izj6c2tb3z4s8qk26s03bfz blog]# git push -u origin master
[root@izj6c2tb3z4s8qk26s03bfz blog]# git push -u origin master2:master

note

  1. git fetch和git pull的区别
    当 git fetch 命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。 它只会获取数据然后让你自己合并。然而,有一个命令叫作 git pull 在大多数情况下它的含义是一个 git fetch 紧接着一个 git merge 命令。 如果有一个像之前章节中演示的设置好的跟踪分支,不管它是显式地设置还是通过 clone 或 checkout 命令为你创建的,git pull 都会查找当前分支所跟踪的服务器与分支,从服务器上抓取数据然后尝试合并入那个远程分支。
    由于 git pull 的魔法经常令人困惑所以通常单独显式地使用 fetch 与 merge 命令会更好一些
  2. 上游快捷方式
    当设置好跟踪分支后,可以通过 @{upstream} 或 @{u} 快捷方式来引用它。 所以在 master 分支时并且它正在跟踪 origin/master时,如果愿意的话可以使用 git merge @{u} 来取代 git merge origin/master。
  3. 远程仓库名字 “origin” 与分支名字 “master” 一样,在 Git 中并没有任何特别的含义一样。 同时 “master” 是当你运行 git init 时默认的起始分支名字,原因仅仅是它的广泛使用,“origin” 是当你运行 git clone 时默认的远程仓库名字。 如果你运行 git clone -o booyah,那么你默认的远程分支名字将会是 booyah/master

git打标签和命令别名配置

参见官网