github的应用很广泛,已经成为一个程序员必备的一项技能。不会git管理,基本上不是一个合格的程序员。本文对此作下总结,方便后续查阅
git使用
本文的重点不在此处,这里读者可参考廖雪峰
老师的博文。里面对git的原理以及安装使用分析的很到位,并且结合了很多实例用于讲解,是很优秀的文章集锦,此处博主深度安利下。博主只记录下本身遇到的有用的命令供以后查阅
git merge 和 git rebase
都是可以用来合并
代码文件的命令。两者合并的概念有所不同。
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
为例
#切换分支到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 logcommit 03fde2c26e391c5b7732677abf763cc9104251c2Merge: 2f19739 e06bb86Author: jtjsir <**@163.com>Date: Fri Mar 2 14:55:26 2018 +0800 fix conflictcommit 2f1973967ca0559ebbe3772b2c735e7e39304818Author: jtjsir <**@163.com>Date: Fri Mar 2 14:52:52 2018 +0800 fix syntax -by mastercommit e06bb8683f2ea69a9fac825c5ccc732c34370f82Author: jtjsir <**@163.com>Date: Fri Mar 2 14:48:20 2018 +0800 fix syntax error -by branch_feature1commit d0f6c095b99416db7c4a9f45c47e467fd7abaa9dAuthor: jtjsir <**@163.com>Date: Fri Mar 2 11:11:29 2018 +0800 add comment for java. -by branch_v1 ...#简便列表展示$ git log --pretty=oneline03fde2c26e391c5b7732677abf763cc9104251c2 fix conflict2f1973967ca0559ebbe3772b2c735e7e39304818 fix syntax -by mastere06bb8683f2ea69a9fac825c5ccc732c34370f82 fix syntax error -by branch_feature1d0f6c095b99416db7c4a9f45c47e467fd7abaa9d add comment for java. -by branch_v155f4ebf23d3ec8214c5caf83c13b23441ccf24e8 add php codes7cfa63ed7da74212cd3532a5e4032af08af9ff90 add java codes2dcf842671698a0be0ff41f7d1838195201ecfe2 Initial commit#同上$ git log --oneline03fde2c fix conflict2f19739 fix syntax -by mastere06bb86 fix syntax error -by branch_feature1d0f6c09 add comment for java. -by branch_v155f4ebf add php codes7cfa63e add java codes2dcf842 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#回滚某个文件[add操作后commit操作前]$ git reset HEAD
git diff
git
在本地有个这样的逻辑:
#工作区-->暂存区(add操作后存放)-->本地git版本库(commit操作后存放)working directory --> stage area(.git/index文件)--> git repository(.git/refs目录)
比较版本之间的差异或者文件。常用方式如下
#拿工作区和暂存区比较差异$ git diff#拿工作区的整体或者某文件与上一版本比较差异$ git diff HEAD^#拿工作区与指定版本比较差异$ git diff #拿暂存区与指定版本比较差异$ git diff --cached #比较两个指定版本的差异$ git diff
总结
好记性不如烂笔头