git学习
Posted sugar2019
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了git学习相关的知识,希望对你有一定的参考价值。
参考廖雪峰的GIT教程
一、初始化一个Git仓库,使用git init
命令。
添加文件到Git仓库,分两步:
- 使用命令
git add <file>
,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>
,完成。
二、git status
命令可以让我们时刻掌握仓库当前的状态
git diff
顾名思义就是查看difference,看具体修改了什么内容
三、
-
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。 -
穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 -
要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
四、工作区和版本库
工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一 个指针叫HEAD
。即版本库包含三个东西--暂存区、master,HEAD。
五、管理修改
Git跟踪并管理的是修改,而非文件。
发生多次修改后都要git add ,否则git commit后,未git add的修改将不会被提交到master中。
六、撤销修改
1.git checkout -- file
可以丢弃工作区的修改
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
2.git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区:
你作的修改被提交到了暂存区,可以利用它把暂存区的修改撤销掉,再用用命令git checkout -- file
撤销工作区的修改。
小结:
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了场景1, 第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
七、删除文件
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm
命令删了:rm test.txt
。
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了。
如果确实要从版本库中删除该文件,那就用命令git rm
删掉,并且git commit,文件就从版本库中被删除了。
如果是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本git checkout -- test.txt。
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
至于撤销删除,参考“撤销修改”以及“版本回退”。
八、SSH Key
本地Git仓库和GitHub仓库之间的传输是通过SSH加密的。shell中执行
ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可。
cd~(进入用户主目录) cd .ssh(进入.ssh目录) ls(列出.ssh目录的文件,可以看到id_rsa id_rsa.pub两个文件) cat ~/.ssh/id_rsa.pub(可以看到id_rsa.pub文件的 内容,复制即可)。
登陆GitHub,打开“Account settings”,“SSH Keys”页面: 然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容。
最后,点“Add Key”,你就应该看到已经添加的Key。
九、添加远程库:(现有本地库,关联到远程库)
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git
;
关联后,使用命令git push -u origin master
第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改;
十、从远程库克隆到本地
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone
命令克隆
git clone git@github.com:
path/repo-name.git
你也许还注意到,GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git
这样的地址。实际上,Git支持多种协 议,默认的git://
使用ssh,但也可以使用https
等其他协议。
使用https
除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh
协议而只能用https
。
十一、创建与合并分支
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
十二、解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。然后删除分支。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph
命令可以看到分支合并图。
git log --graph --pretty=oneline --abbrev-commit
十三、分支管理策略
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支 发布1.0版本;
通常,合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
准备合并dev
分支,请注意--no-ff
参数,表示禁用Fast forward
:
git log --graph --pretty=oneline --abbrev-commit
十四、BUG分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场。
git stash可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。
git stash list查看工作现场存储在哪。
恢复工作现场:1.用git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;
2.用git stash pop
,恢复的同时把stash内容也删了
你可以多次stash,恢复的时候,先用git stash list
查看,然后恢复指定的stash,用命令:$ git stash apply stash@0
十五、Feature分支(强行删除该分支)
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,使用git branch -d <name>时git会提醒
,使用可以通过git branch -D <name>
强行删除。
十六、多人协作
1.要查看远程库的信息,用git remote,
或者用git remote -v
显示更详细的信息。
2.推送分支。推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应
的远程分支上:git push origin master
。如果要推送其他分支,比如dev
,就改成:git push origin dev。
3.抓取分支。
你的小伙伴要在dev
分支上开发,就必须创建远程origin
的dev
分支到本地,于是他用这个命令创建本地dev
分支:
git checkout -b dev origin/dev
现在,他就可以在dev
上继续修改,然后,时不时地把dev
分支push
到远程:git push origin dev
如果你同样修改了
因此,多人协作的工作模式通常是这样:
-
首先,可以试图用
git push origin <branch-name>
推送自己的修改; -
如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; -
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
小结
-
查看远程库信息,使用
git remote -v
; -
本地新建的分支如果不推送到远程,对其他人就是不可见的;
-
从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交; -
在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致; -
建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
; -
从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。
十七、标签管理之创建标签
标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
命令git tag <tagname>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id,git tag <tagname> <id>;
命令git tag -a <tagname> -m "blablabla..."
可以指定标签信息;
用git show <tagname>
查看标签信息;
命令git tag
可以查看所有标签。
十八、标签管理之操作标签
-
命令
git push origin <tagname>
可以推送一个本地标签; -
命令
git push origin --tags
可以推送全部未推送过的本地标签; -
命令
git tag -d <tagname>
可以删除一个本地标签; -
命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。 - 如果标签被推送到了远程,要删除远程标签,先从本地删除,再从远程删除。
十九、使用github
如何参与一个开源项目呢?比如人气极高的bootstrap项目,这是一个非常强大的CSS框架,你可以访问它的项目主页https://github.com/twbs/bootstrap,点“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后,从自己的账号下clone:
git clone git@github.com:michaelliao/bootstrap.git
一定要从自己的账号下clone仓库,这样你才能推送修改。如果从bootstrap的作者的仓库地址git@github.com:twbs/bootstrap.git
克隆,因为没有权限,你将不能推送修改。
Bootstrap的官方仓库twbs/bootstrap
、你在GitHub上克隆的仓库my/bootstrap
,以及你自己克隆到本地电脑的仓库,他们的关系就像下图显示的那样:
┌─ GitHub ──────────────────────────────────── ┐
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ twbs/bootstrap │──>│ my/bootstrap │ │
│ └─────────────────┘ └─────────────────┘ │
│ ▲ │
└──────────────────────────────────┼──────┘
▼
┌───────────┐
│ local/bootstrap │
└───────────┘
以上是关于git学习的主要内容,如果未能解决你的问题,请参考以下文章