github的应用很广泛,已经成为一个程序员必备的一项技能。不会git管理,基本上不是一个合格的程序员。本文对此作下总结,方便后续查阅
git使用
本文的重点不在此处,这里读者可参考廖雪峰
老师的博文Git教程。里面对git的原理以及安装使用分析的很到位,并且结合了很多实例用于讲解,是很优秀的文章集锦,此处博主深度安利下。博主只记录下本身遇到的有用的命令供以后查阅
git merge 和 git rebase
都是可以用来合并
代码文件的命令。两者合并的概念有所不同。
1.调用方式
git merge
#先切换至被合并的分支
$ git checkout master
#执行merge命令,让v1来合并当前分支
$ git merge v1
git rebase
#即合并v1分支到master分支,且会自动切换至master分支
$ git rebase v1 master
#也可采取这种方式
$ git checkout master
$ git rebase v1
2.合并步骤
git merge
命令其会比较两个branch的commit节点,然后进行合并,如果有冲突则会产生新的commit节点;
git rebase <upstream-branch-name> <to-branch-name>
命令则会执行以下逻辑
1.切换到to-branch分支;
2.将to-branch中比upstream-branch多的commit先撤销掉,并将这些commit放在一块临时存储区(.git/rebase);
3.将upstream-branch中比to-branch多的commit应用到to-branch上,此刻to-branch和upstream-branch的代码状态一致;
4.将存放的临时存储区的commit重新应用到to-branch上;
5.结束。
执行完上述第3步后,to-branch的代码状态已经改变,接着执行第4步时则可能会产生合并冲突。
Tips:
-
git rebase
操作即使在产生冲突的时候也不会重新产生新的commit id,而git merge
在绝大部分情况下则会产生新的commit id(除非待合并的分支与当前分支是包含关系而不是交叉关系) -
git rebase
在解决完冲突后,需要执行git rebase --continue
才算合并结束。合并后两个branch的commit记录都会保存下来。另外这里也罗列下其他的两个命令方法#放弃挂起的patch提交记录,也就是直接应用源branch的提交记录,舍弃本身的提交记录 $ git rebase --skip #即撤销rebase操作 $ git rebase --abort
-
git merge
默认情况下是使用fast forward
方式合并的,其会忽略合并信息,加上--no-ff -m "commit merge"
参数则会记录合并操作
git branch 和 git checkout
都是可以用于创建分支
的命令。但git checkout
的功能比git branch
强大,下述以创建分支v1
为例
1.分支创建
#切换分支到master
$ git checkout master
#创建分支v1,但是不会自动切换上下文至v1分支,此处仍为master分支
$ git branch v1
-------------------------------
-------------------------------
#根据当前分支创建v1分支并且切换上下文至v1
$ git checkout -b v1
2.分支与远程关联
如果创建的分支想关联远程仓库的分支,此处假设远程服务器已创建分支v1
,则可以使用以下命令
#创建分支v1,并关联远程的v1仓库
$ git checkout -b v1 origin/v1
上述操作主要是方便本地v1
分支的修改推送到远程上能自动映射,如果使用git branch
,则需要进行关联操作才可以git push
$ git branch --set-upstream v1 origin/v1
3.分支删除
#删除v1分支
$ git branch -d v1
#强制删除v1分支
$ git branch -D v1
4.分支查看
#查看本地分支(带*即为当前分支)
$ git branch
feature1
master
* v1
#查看远程分支
$ git branch -r
origin/HEAD --> origin/master
origin/master
origin/v1
#查看远本地分支的具体信息
$ git branch -v
5.文件操作
git checkout -- <file>
还可用于还原指定文件到最近的一次git add
或者git commit
对应的记录
Tips:分支的创建、删除、合并在git的本地操作是非常快的,所以git很推荐使用分支来处理代码的编写、合并。
git clone 和 git fetch/git pull
三者命令都可以用来下载
远程仓库代码。三者调用方式如下
#两种方式下载远程代码,ssh方式和https方式
$ git clone git@github.com:jtjsir/GitTest
$ git clone https://github.com/jtjsir/GitTest.git
#git pull 下载方式
$ mkdir GitTest
$ git init
$ git remote add origin https://github.com/jtjsir/GitTest.git
$ git pull origin master
#如果当前分支为master,则下述调用方式同上
$ git pull
#以下方式并不能下载文件
$ git fetch origin master
git pull
包含了git fetch
和git merge
git fetch
其会拿取远程库的最新commit id与本地分支指向远程库的commit id进行对比(.git/refs/remote/origin/{branch}),如果不一致,则设置为最新的commit id。而git pull
操作在git fetch
的基础上进行判断,如果commit id不一致,则会调用git merge
拉取线上最新的代码合并至本地一般建议使用
git clone
来初次下载仓库,后续操作采用git pull
命令更新仓库
git push
推送本地仓库到远程仓库。语法如下
git push <remote> <localRepo>:<remoteRepo>
。这里罗列下其用途
#上传本地master分支到远程origin的master分支
$ git push origin master
#创建远程分支v1(v1分支在远程服务器尚未存在),执行下述命令刷新github服务器即有v1分支
$ git push origin v1:v1
#删除远程分支v1
$ git push origin :v1
git log
用于查看当前分支的提交情况,常用用法有
#列表形式,所列信息较详细
$ git log
commit 03fde2c26e391c5b7732677abf763cc9104251c2
Merge: 2f19739 e06bb86
Author: jtjsir <**@163.com>
Date: Fri Mar 2 14:55:26 2018 +0800
fix conflict
commit 2f1973967ca0559ebbe3772b2c735e7e39304818
Author: jtjsir <**@163.com>
Date: Fri Mar 2 14:52:52 2018 +0800
fix syntax -by master
commit e06bb8683f2ea69a9fac825c5ccc732c34370f82
Author: jtjsir <**@163.com>
Date: Fri Mar 2 14:48:20 2018 +0800
fix syntax error -by branch_feature1
commit d0f6c095b99416db7c4a9f45c47e467fd7abaa9d
Author: jtjsir <**@163.com>
Date: Fri Mar 2 11:11:29 2018 +0800
add comment for java. -by branch_v1
...
#简便列表展示
$ git log --pretty=oneline
03fde2c26e391c5b7732677abf763cc9104251c2 fix conflict
2f1973967ca0559ebbe3772b2c735e7e39304818 fix syntax -by master
e06bb8683f2ea69a9fac825c5ccc732c34370f82 fix syntax error -by branch_feature1
d0f6c095b99416db7c4a9f45c47e467fd7abaa9d add comment for java. -by branch_v1
55f4ebf23d3ec8214c5caf83c13b23441ccf24e8 add php codes
7cfa63ed7da74212cd3532a5e4032af08af9ff90 add java codes
2dcf842671698a0be0ff41f7d1838195201ecfe2 Initial commit
#同上
$ git log --oneline
03fde2c fix conflict
2f19739 fix syntax -by master
e06bb86 fix syntax error -by branch_feature1
d0f6c09 add comment for java. -by branch_v1
55f4ebf add php codes
7cfa63e add java codes
2dcf842 Initial commit
#图形化展示
$ git log --graph --oneline --abbrev-commit
* 419deae fixed the merge by v1
|
| * d83903d add comment by v2
* | 2615020 modify by v1
|/
* 43aabae add comment by v1
* 03fde2c fix conflict
|
| * e06bb86 fix syntax error -by branch_feature1
* | 2f19739 fix syntax -by master
|/
* d0f6c09 add comment for java. -by branch_v1
* 55f4ebf add php codes
* 7cfa63e add java codes
* 2dcf842 Initial commit
git stash
缓存当前的工作区间状态。常用于突发情况下的bug修复,缓存当前工作区间方便以后继续解决
#缓存当前分支状态
$ git stash
#查看当前分支状态列表
$ git stash list
#恢复最新的分支状态并在list集合中删除
$ git stash pop
#恢复当前分支的指定状态
$ git stash apply stash@{0}
git reset
回滚提交操作,常用命令如下
#回滚到上一个提交
$ git reset --hard HEAD^
#回滚到上两个版本的提交
$ git reset --hard HEAD^^
#回滚到上50个版本的提交
$ git reset --hard HEAD~50
#回滚到指定的版本,根据commit id
$ git reset --hard <commit id>
#回滚某个文件[add操作后commit操作前]
$ git reset HEAD <file>
git diff
git
在本地有个这样的逻辑:
#工作区-->暂存区(add操作后存放)-->本地git版本库(commit操作后存放)
working directory --> stage area(.git/index文件)--> git repository(.git/refs目录)
比较版本之间的差异或者文件。常用方式如下
#拿工作区和暂存区比较差异
$ git diff
#拿工作区的整体或者某文件与上一版本比较差异
$ git diff HEAD^ <pathfile>
#拿工作区与指定版本比较差异
$ git diff <commit-id> <pathfile>
#拿暂存区与指定版本比较差异
$ git diff --cached <commit-id>
#比较两个指定版本的差异
$ git diff <commit-id> <commit-id>
总结
好记性不如烂笔头