git命令总结
Posted shuqiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了git命令总结相关的知识,希望对你有一定的参考价值。
参考来源:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
1.初始化git仓库
mkdir <file> //创建一个空目录
cd <file> //进入该目录
git init //把这个目录变成git可以管理的仓库:
2.添加文件到git仓库
git add <file> //可反复多次使用,添加多个文件到暂存区
git commit -m <message> //提交暂存区的文件到当前分支,并添加注释
3.查看工作区状态
git status
4.查看工作区修改内容
git diff <file> //查看工作区修改内容与暂存区的区别(git add前)
git diff HEAD -- <file> //查看工作区与版本库里最新版本的区别
5.查看commit提交历史,以便确定要回退到哪个版本
git log
git log --pretty=oneline
6.回退版本
HEAD指向的版本就是当前版本,
git reset --hard HEAD^ //回退到上一个版本
git reset --hard HEAD^^ //回退到上上一个版本
git reset --hard HEAD~100 //回退到之前第100个版本
git reset --hard commit_id //回退到指定commit_id的版本
git reset HEAD file //把暂存区的修改撤销掉(unstage),重新放回工作区
7.查看命令历史,确认commit_id,以确定要回到未来的那个版本
git reflog
8.工作区vs暂存区
工作区:电脑里能够看到的目录
版本库:工作区里有个隐藏的目录.git,这个不算工作区,而是git的版本库。
git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,
还有git自动为我们创建的第一个分支master,以及指向master的一个指针叫HEAD。
git add:把文件修改从工作区添加到暂存区
git commit:把暂存区的所有内容提交到当前分支
9.撤销修改
git checkout -- <file> //撤销工作区修改:让工作区文件回到最近一次git commit或git add后的状态
git checkout -- <file> 命令中的--很重要,没有--,就变成了切换到另一个分支的命令
git reset HEAD file //撤销暂存区修改:把暂存区的修改撤销掉(unstage),重新放回工作区
10.删除文件
rm file //从工作区删除该文件
git rm file //添加删除文件命令到暂存区
git commit //从当前分支中删除该文件
11.本地分支添加到远程库
git remote add origin https://github.com/dreamsusana/learngit.git //关联远程仓库
git push -u origin master //把本地库的当前分支master推送到远程上
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,git不但会把本地的master分支推送到远程新的master分支,
还会把本地master分支和远程master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地做了提交,就可以通过以下命令,把本地master分支的最新修改推送至github
git push origin master
12.从远程克隆
1) 创建远程库,勾选initialize this repository with a readme
2)git clone https://github.com/dreamsusana/skill.git
github给出的地址不止一个,默认使用ssh协议,但也可以使用https等协议。
使用https除了速度慢意外,最大的麻烦是每次推送都必须输入口令。
13.分支管理
1)创建与合并分支
git branch branch_name //创建分支
git checkout branch_name //切换到新建分支
git checkout -b branch_name //创建并切换到分支
git branch //列出所有分支,*号标记的为当前分支
git checkout master //切换到master分支
git merge branch_name //用于合并指定分支到当前分支
git branch -d branch_name //删除分支
2)解决冲突
git status //查看分支合并时冲突的文件
git log --graph --pretty=oneline --abbrev-commit //查看分支合并情况
git log --graph //查看分支合并图
当git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,完成合并。
解决冲突就是把git合并失败的文件手动编辑为我们希望的内容,再提交
3)分支管理策略
通常,合并分支时,如果可能,git会用fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用fast forward模式,加上--no-ff参数就可以使用普通模式合并,git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" branch_name //因为本次合并要创建一个新的commit,所以加上-m 参数,把commit描述写进去
git log --graph --pretty=oneline --abbrev-commit //查看分支合并情况
分支管理原则:
a.master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活
b.干活都在dev分支上,dev分支是不稳定的,比如到1.0版本发布时,再把dev分支合并到master上,在master分支上发布1.0版本
c.你和你的小伙伴每个人都在dev分支上干活,每个人都有自己的分支,时不时往dev分支上合并就可以了。
4)bug分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除。
当手头工作没有完成是,先把工作现场git stash一下,然后去修复bug,修复后,在git stash pop,回到工作现场
git stash //把当前工作现场储藏起来,等以后恢复现场后继续工作
git status //此时查看工作区,就是干净的,因此可以放心的创建分支来修复bug
git stash list //bug修复完毕后,查看之前储藏的工作区
git stash apply //恢复工作区,stash内容并不删除
git stash drop //删除stash内容
git stash pop //恢复工作区,并删除stash内容
git stash list //删除stash内容后,就看不到stash内容了
git stash apply [email protected]{0} //多次stash后,先通过git stash list查看,然后恢复指定的stash
5)feature分支
每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后删除该feature分支。
git checkout -b feature-vulcan //创建并切换到feature-vulan分支
git add vulcan.py //将vulcan.py文件添加到暂存区
git status //查看分支状态
git commit -m "add feature vulcan" //把暂存区的所有内容提交到当前分支
git checkout dev //切换到dev分支
一切顺利的话,feature分支和dev分支合并,然后删除feature分支。
但就在这时,领导要求取消新功能,并且feature分支必须就地销毁
git branch -d feature-vulcan //git友情提示,feature-valcan分支还没有合并,如果删除,将丢失掉修改,如果要强行删除,需要使用大写的-D参数。
git branch -D feature-vulcan //强行删除未合并分支,需要使用大写的-D参数
6)多人协作
当你从远程仓库克隆时,实际上git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
git remote //查看远程库的信息
git remote -v //查看远程库的更详细的信息
git push origin master //把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,git就会把该分支推送到远程库对应的远程分支上
并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要时刻与远程同步
dev分支是开发分支,团队所有成员都要在上面工作,所以也需要与远程同步
bug分支只用于在本地修复bug,就没必要推到远程了
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
总之,就是在git中,分支万元可以在本地自己藏着玩,是否推送,视你的心情而定。
git checkout -b dev origin/dev //创建远程origin的dev分支到本地,并切换到dev分支
git add <filename> //把工作区修改的内容添加到暂存区
git push origin dev //把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,git就会把该分支推送到远程库对应的远程分支上
如果你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件做了修改,并试图推送,就会返回推送失败的错误。
因为你的小伙伴的最新提交和你试图推送的提交有冲突,git提示我们,先通git pull把最新的提交从ortgin/dev抓下来,然后在本地合并,解决冲突,再推送
git pull //从origin/dev抓取最新的提交
git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接
git branch --set-upstream-to=origin/dev dev //设置本地dev与远程origin/dev分支的链接
git pull //重新pull,成功
//解决冲突重新提交
git commit -m "fix env conflict"
git push origin dev
因此,多人协作的工作模式是这样的:
a.首先,用git push origin <branch-name>推送自己的修改
b.如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并
c.如果合并有冲突,则解决冲突,并在本地提交
d.没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功
e.如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,则输入如下命令来创建链接
git branch --set-upstream-to <branch-name> origin/<branch-name>
7)Rebase:可以把本地未push的分叉提交历史整理成直线,看上去更直观。
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
git rebase //需要在git push之前执行git rebase
14.标签管理
发布一个版本时,我们通常先在版本库中打了一个标签,这样就确定了唯一的的打标签适合的版本。
将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。
git的标签其实就是指向某个commit的指针。tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。
1)创建标签:
首先切换到需要打标签的分支上
git tag v1.0 //在最新提交的commit上打一个名为v1.0的新标签
git tag v0.8 f52c633 //在历史提交的commit中打一个名为v0.8的新标签
git tag -a v0.1 -m "version 0.1 released" 1094adb //创建带有说明的标签:-a指定标签名,-m指定说明文字
git tag //查看所有标签,标签按字母排序
git show v0.9 //查看标签信息,保持commit id、date、说明文字等
注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这个两个分支上都可以看到标签。
2)标签推送远程
git push origin v1.0 //推送标签到远程origin仓库
git push origin --tags //推送全部尚未推送到远程的本地标签
3)删除标签
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
git tag -d v0.1 //删除本地标签
git push origin :refs/tags/v0.9 //删除远程仓库的标签,需先删除本地标签
15.配置Git
每个仓库的Git配置文件都放在.git/config文件中
当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中
可以直接修改配置文件,也可以通过命令配置:
git config --global color.ui true //配置git显示颜色
git config --global alias.st state //设置别名,用st来表示state
--global //--global参数是全局参数,表示这些命令在这台电脑的所有Git仓库下都有用
忽略特殊文件:
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,并将.gitignore文件提交到gitGit就会自动忽略这些文件。
忽略文件的原则:
a.忽略操作系统自动生成的文件,比如缩略图
b.忽略编译生成的中间文件、可执行文件等
c.忽略你自己的带有敏感信息的配置文件,比如存放密码的配置文件。
以上是关于git命令总结的主要内容,如果未能解决你的问题,请参考以下文章