Git常用命令总结

2018年06月08日 14:37:39 Elvis_lfc 阅读数 290

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/Elvis_lfc/article/details/80622912

Git

git bash下 cd 切换目录,pwd显示当前目录 ls或dir 显示目录下文件 ,rm删除文件

在E:下新建learnGit文件夹,此时他只是个目录,将他变为git仓库,打开git bash切换到此目录 cd e: 之后cd learnGit

在该目录下执行 git init ,此时你会发现目录下多了一个.git文件,然后创建一个readme.txt文件,内容随便写,以下东西都是基于readme.txt来进行的

git init 初始化一个空仓库,Git自动为我们创建了一个master分支

工作区:就是你的工作目录 如E:\learnGit
.git 表示git版本库   staged(或index) 就是暂存区
git add XXX.txt 添加到暂存区
git add -A 全部提交到暂存区
git commit -m "xxx" 提交到仓库  XXX为备注
第一步是用“git add”把文件添加进去,实际上就是把文件从工作区添加到暂存区; 
第二步是用“git commit”提交更改,实际上就是把暂存区的所有内容提交到当前分支。 
commit:提交的是暂存区的内容,而非工作区的
git status 检查状态
git diff 对比
git log  提交日志
git log --pretty=oneline 日志显示一行 注意:每个人的commit id都不一样
第三次提交  3628164fb26d48395383f8f31179f24e0882e1e0(commit id) append GPL  备注
第二次提交  ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed 
第一次提交  cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file 
HEAD^ 回退到上个版本 HEAD^^  回退到上上个版本 HEAD~100  回退到之前100个版本
git reset --hard HEAD^ 回退到第二次提交
此时 git log --pretty=oneline 查看最新的是我们上面的第二次提交,第三次提交不见了
bade4a31a0d2d4487e67fe367e0741c7712b4e77 add distributed
d82cb2bb230b72f04e7edc335a187b9289d082da addtxt
如何回到第三次提交?只要窗口没关,我们可以根据commit id 回退
git reset --hard 3628164fb(第三次提交id) 再次回到之前版本
it log --pretty=oneline 查看如下
deb77a2d31cef84e276804bc293e872a72874306 add GPL
bade4a31a0d2d4487e67fe367e0741c7712b4e77 add distributed
d82cb2bb230b72f04e7edc335a187b9289d082da addtxt
如果窗口关了咋办?
git reflog 追踪提交日志,如下  是不是有 commit id了
bade4a3 HEAD@{0}: reset: moving to HEAD^
deb77a2 HEAD@{1}: reset: moving to deb77a2d31
bade4a3 HEAD@{2}: reset: moving to HEAD^
deb77a2 HEAD@{3}: commit: add GPL
bade4a3 HEAD@{4}: commit: add distributed
d82cb2b HEAD@{5}: commit (initial): addtxt
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。 


撤销工作区的修改,没有被提交到暂存区,git checkout -- file命令中的“--”很重要,没有“--”,就变成了“创建分支命令
git checkout -- readme.txt 
如果已经提及到到了暂存区,使用下面命令可以把暂存区的修改撤销掉 
git reset HEAD readme.txt  ,然后使用 git checkout -- readme.txt  修改工作区到上个版本和分支一致
从分支删除文件,要先删除,再提交
git rm a.txt 然后 git commit -m "remove a.txt" 
本地提交到远程
github注册账号,新建repository名字learngit
查看远程分支
git remote
查看本地分支
git branch
添加远程仓库分支origin
git remote add origin [email protected]:lifucai/learngit.git 注意:名字要改
把当前分支master推送到远程,
git push -u origin master 加上了-u参数,Git不但会把本地的 master分支内容推送的远程新的master分支,
还会把本地的master分支和远程的master分支关联起来
之后再推送到远程
git push origin(远程分支) master (本地分支)
远程clone到本地
先在github上创建repository
git bash执行,把远程库clone 到本地
git clone https://github.com/lifucai/gitskills.git 名字要改
创建远程origin的dev分支到本地
git checkout -b dev origin/dev  
git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示, 
设置dev和origin/dev的链接:git branch --set-upstream dev origin/dev
git pull 拉取,git push 推送
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,
用命令git branch --set-upstream branch-name origin/branch-name。 
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交; 
• 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branchname,本地和远程分支的名称好一致; 
• 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
• 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。


分支
创建dev分支,然后切换到dev分支
git checkout -b dev
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令: 
git branch dev 
然后,用git branch命令查看当前分支: 
git branch 
* dev(星号 表示当前分支)
master
在当前分支修改文件后,切换到master分支
切换分支
git checkout master 
切换回来后发现刚才修改没有,因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:
合并分支,把dev分支修改合并到当前分支
git merge dev 
删除分支
git branch -d dev 
之后执行git branch 发现只有 master分支了
查看分支:git branch 创建分支:git branch name 切换分支:git checkout name
创建+切换分支:git checkout -b name 合并某分支到当前分支:git merge name 删除分支:git branch -d name 
解决冲突
新建分支feature1
git checkout -b feature1 
修改readme.txt后一行,改为: Creating a new branch is quick AND simple. 
在feature1分支上提交:
git add readme.txt 
git commit -m "AND simple" 
切换到master分支:  git checkout master
在master分支上把readme.txt文件的后一行改为: Creating a new branch is quick & simple. 
在master上提交
git add readme.txt 
git commit -m "& simple" 
合并 git merge feature1 
Auto-merging readme.txt CONFLICT (content): 
Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result. 
果然冲突了!Git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件:
直接查看redeme.txt
Git is a distributed version control system. 
Git is free software distributed under the GPL. 
Git has a mutable index called stage. 
Git tracks changes. 
<<<<<<< HEAD
Creating a new branch is quick
Creating a new branch is quick & simple. 
=======
iCreating a new branch is quick
Creating a new branch is quick AND simple.
>>>>>>> feature1
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
用带参数的git log也可以看到分支的合并情况: 用git log --graph命令可以看到分支合并图
git log --graph --pretty=oneline --abbrev-commit 
* 8403262 AND f1
* 1f7ccb7 AND simple
* 309dbfb 123
*   3b50450 fix conflict
|\
| * edc35f2 AND simple
* | fef180b & simple
|/
* bcd79d2 branch test
* e993ecd add test.txt
* b76900c remove test.txt
* b4f4465 add test.txt


通常,合并分支时,如果可能,Git会用“Fast forward”模式,但这种模式下,删除分支后,会丢掉分支信息。 
如果要强制禁用“Fast forward”模式,Git就会在merge时生成⼀一个新的commit,这 样从分支历史上就可以看出分支信息。 
下面我们实战一下--no-ff方式的merge: 首先,仍然创建并切换dev分支:
git checkout -b dev 
修改readme.txt文件,并提交一个新的commit: 
git add readme.txt
git commit -m "add merge" 
切回master分支   
git checkout master 
准备合并dev分支,请注意--no-ff参数,表⽰示禁用“Fast forward 模式
git merge --no-ff -m "merge with no-ff" dev 
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。 
合并后查看历史
git log --graph --pretty=oneline --abbrev-commit 
*   df7a383 merge with no-ff
|\
| * b41f0d7 add merge
|/
*   5a8c94e conflict fixed
|\
| * 8403262 AND f1
* | 17200e6 add master
可以看到,不使用“Fast forward”模式,merge后就像这样:
分支策略 
在实际开发中,我们应该按照几个基本原则进行分支管理: 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如 1.0版本发布时,再把dev分支合并到master上
在master分支发布1.0版本; 你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。 
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作: 
git stash list 可以查看工作现场
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了
先用git stash list查看,然后恢复指定的stash⽤用命令: git stash apply stash@{0}
强行删除分支
git branch -D feature-vulcan
开发一个新feature,最好新建一个分支; 如果要丢弃一个没有被合并过的分支,可以通过git branch -D name强行删除。
要查看远程库的信息,用git remote  或者 git remote -v(会显示抓取和推送的origin的地址)
标签(默认为HEAD,最新提交)
git tag v1.0
查看标签
git tag
给某一次提交打tag
git tag v0.9 6224937(commit id) 
查看标签信息: 
git show v0.9 (tagname)
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
git tag -a v0.1 -m "version 0.1 released" 3628164(commit id)
删除标签,创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。 
git tag -d v0.1 
如果要推送某个标签到远程,使用命令  git push origin tagname: 
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
git tag -d v0.9 
然后从远程删除。删除命令也是push,但是格式如下: 
git push origin :refs/tags/v0.9 
要看看是否真的从远程库删除了标签,可以登陆GitHub查看
• 命令git push origin tagname可以推送一个本地标签;
• 命令git push origin --tags可以推送全部未推送过的本地标签; 
• 命令git tag -d tagname可以删除一个本地标签; 
• 命令git push origin :refs/tags/tagname可以删除一个远程标签。
在GitHub上,可以任意Fork开源仓库; 
• 自己拥有Fork后的仓库的读写权限;
• fork之后从自己的仓库clone到本地 ,修改之后可以push到远程仓库
• 可以推送pull request给官方仓库来贡献代码。
有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦等等,
每次git status都会显示“Untracked files ...”,有强迫症的童 鞋心里肯定不爽。 好在Git考虑到了大家的感受,这个问题解决起来也很简单,
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。 
不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就 可以使用了。
所有配置文件可以直接在线浏览:https://github.com/github/gitignore 忽略文件的原则是:
 1. 忽略操作系统自动生成的文件,比如缩略图等;
 2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库
 比如Java编译产生的.class文 件; 
 3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。 
 最后一步就是把.gitignore也提交到Git,就完成了!当然检验.gitignore的标准是git status 命令是不是说“working directory clean”。 
 使用Windows的童鞋注意了,如果你在资源管理器里新建一个.gitignore文件,它会非常弱 智地提示你必须输入文件名,
 但是在文本编辑器里“保存”或者“另存为”就可以把文件保 存为.gitignore了。
别名
我们只需要敲一行命令,告诉Git,以后st就表示status: 
git config --global alias.st status 
当然还有别的命令可以简写,很多人都用co表示checkout,ci表示commit,br表示 branch: 
git config --global alias.co checkout 
git config --global alias.ci commit 
git config --global alias.br branch 
命令git reset HEAD file可以把暂存区的修改撤销掉 (unstage),重新放回工作区。
既然是一个unstage操作,就可以配置一个unstage别名: git config --global alias.unstage 'reset HEAD' 
当你敲入命令:  git unstage test.py 实际上Git执行的是:git reset HEAD test.py 
配置一个git last,让其显示最后一次提交信息: 
git config --global alias.last 'log -1' 这样,用git last就能显示最近一次的提交: 
简化版的git log-》git lg
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
* bcd79d2 - branch test (76 minutes ago) <lifucai>
* e993ecd - (origin/master) add test.txt (2 hours ago) <lifucai>
* b76900c - remove test.txt (3 hours ago) <lifucai>
* b4f4465 - add test.txt (3 hours ago) <lifucai>
* 495e313 - git tracks changes (3 hours ago) <lifucai>
* 920e210 - understand how stage works (3 hours ago) <lifucai>
* deb77a2 - add GPL (3 hours ago) <lifucai>
* bade4a3 - add distributed (3 hours ago) <lifucai>
* d82cb2b - addtxt (4 hours ago) <lifucai>

09-24 12:36