@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
分支
- 合并分支前必须先切换到发起合并的分支。如A和B,A合并掉B,需先切换到A。
- 合并分支前,被合并分支需要提交或者清理工作区现场
- 理解fast-foward合并和三方快照合并
- 冲突合并
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
- git fetch和git pull的区别
当 git fetch 命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。 它只会获取数据然后让你自己合并。然而,有一个命令叫作 git pull 在大多数情况下它的含义是一个 git fetch 紧接着一个 git merge 命令。 如果有一个像之前章节中演示的设置好的跟踪分支,不管它是显式地设置还是通过 clone 或 checkout 命令为你创建的,git pull 都会查找当前分支所跟踪的服务器与分支,从服务器上抓取数据然后尝试合并入那个远程分支。
由于 git pull 的魔法经常令人困惑所以通常单独显式地使用 fetch 与 merge 命令会更好一些 - 上游快捷方式
当设置好跟踪分支后,可以通过 @{upstream} 或 @{u} 快捷方式来引用它。 所以在 master 分支时并且它正在跟踪 origin/master时,如果愿意的话可以使用 git merge @{u} 来取代 git merge origin/master。 - 远程仓库名字 “origin” 与分支名字 “master” 一样,在 Git 中并没有任何特别的含义一样。 同时 “master” 是当你运行 git init 时默认的起始分支名字,原因仅仅是它的广泛使用,“origin” 是当你运行 git clone 时默认的远程仓库名字。 如果你运行 git clone -o booyah,那么你默认的远程分支名字将会是 booyah/master
git打标签和命令别名配置
参见官网