很久以前练习git时候写的一篇学习记录
首先选择一个合适的地方,创建一个空目录:
mkdir learngit
cd learngit
pwd 此命令用于显示当前目录
第二步,把当前目录变成Git可以管理的仓库
git init
把文件放到learngit目录或者子目录下
第一步,把文件添加到仓库
git add readme.txt
第二步,把文件提交到仓库,-m后面的内容是本次提交的说明
git commit -m “wrote a readme file”
命令可以让我们时刻掌握仓库的当前状态
git status
查看difference
git diff
命令显示从最近到最远的提交日志
git log
如果嫌显示太多,可以加上–pretty=oneline参数
git log –pretty=oneline
把当前版本回退到上一个版本,HEAD指向的版本就是当前版本
git reset –hard HEAD^
来到了19世纪,想回到21世纪怎么办
只要git bash未关闭,可以往上找,找到21世纪的commit id
git reset –hard commit—_id 前几位就可以,Git会去自动寻找
找不到commit id怎么办嘞
该命令记录了你的每一次命令
git reflog
/learngit文件夹是一个工作区
工作区中有一个隐藏目录/.git,是Git的版本库,版本库里最重要的是称为stage(或者叫index)的暂存区
把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区
第二步是用git commit提交更改,实际上是把暂存区的所有内容提交到当前分支
我们创建Git版本库的时候,Git自动为我们创建了唯一一个master分支,所以现在git commit就是往master分支上提交更改
Git跟踪并管理的是修改,而非文件
什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
显示文本内容
cat file
每次修改,如果不add到暂存区,那就不会加入到commit中
当你改乱了工作区的某个文件的内容(尚未add),想直接丢弃工作区的修改
git checkout – file
当你不但改乱了工作区的某个文件的内容,还添加到了暂存区(已经add),想丢弃修改,分两步
第一步,回到尚未add的状态
git reset HEAD file
第二步,直接丢弃工作区的修改
git checkout – file
如果已经commit了不合适的修改到版本库,想要撤销本次提交,参考#版本回退#一节,前提是没有推送到远程库
删除文件
rm file
从版本库中删除文件
git rm file
再提交
git commit -m “remove file”
现在,文件就从版本库中删除了
另一种情况是删错了,因为版本库里还有,所以可以把误删的文件恢复到最新版本
git chaeckout – file
git checkout其实是用版本库里的版本替换工作区的版本
本地Git仓库和GitHub仓库之间的传输是通过SSH加密的
已经在本地创建了一个Git仓库之后,又想在Github上创建一个Git仓库,并且让这两个仓库同步,
这样,Github上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。
在Github上创建一个新的Git仓库
与本地的Git仓库关联
git remote add origin https://github.com/HeatDeath/repository_name.git
下一步就可以把本地库上的所有内容推送到远程库上:
git push -u origin master
master是当前分支
由于远程库是空的,第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送到
远程新的master分支,还会把本地master分支和远程的master分支关联在一起,在以后的推送或者拉取时可以简化指令。
推送成功后,可以立刻在Github页面中看到远程库的内容已经和本地一模一样
从现在起,只要本地作了提交,就可以通过:
git push origin master
把本地master分支的最新修改推送到Github
用命令git clone克隆一个本地库:
git clone https://github.com/HeatDeath/repository_name.git
cd repository_name
ls
创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,
想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。
在Git里,这个分支叫主分支,即master分支。
HEAD不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的的就是当前分支
创建dev分支,并切换到dev分支:
git checkout -b dev
git checkout命令加上-b参数表示创建并切换,相当于:
git branch dev
git checkout dev
查看分支:
git branch
该命令会列出所有分支,当前分支前面会标有一个*号
现在我们可以在dev分支上正常提交
合并指定分支到当前分支
git merge dev
删除分支
git branch -d dev
当Git无法自动合并分支时,就必须首先解决冲突。
解决冲突之后,在提交,合并完成
git log –graph命令可以看到分支合并图
git log –graph
通常用git merge合并分支时,如果可能Git会用Fast forward模式,
但在这种模式下,删除分之后,会丢失分支信息。
如果强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样可以在分支离殇上看出分支信息
git merge –no-ff
在Git中,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop回到工作现场
查看被储存的工作现场
git stash list
恢复工作现场
git stash apply
但是恢复后,stash内容并不删除
删除需要:
gti stash drop
另一种是:
git stash pop
恢复工作现场的同时,也把stash中的内容删除了
如果多次使用git stash指令
恢复的时候先用git stash list查看,然后恢复指定的stash:
git stash apply stash@{0}
每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后删除该分支
如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除
要查看远程库的信息
git remote
查看远程库更详细的信息
git remote -v
推送分支,就是把该分支上的所有本地提交推送到远程库。
推送时,要指定本地分支,这样Git会把该分支推送到远程库对应的远程分支上:
git push origin master
master分支是主分支,因此要时刻与远程库同步
dev分支是开发分支,团队所有成员都在上面工作,所以也需要与远程库同步
bug分支只用于在本地修复bug,没必要推到远程
feature分支随意
多人协作的工作模式通常是这样的:
1.首先可以试图用 git push origin branch-name推送自己的修改
2.如果推送失败,则因为远程分支比你本地的更新,需要先用git pull试图合并
3.如果合并有冲突,则解决掉冲突,并在本地提交
4.没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功
//如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,
用命令git branch –set-upstream branch-name origin/branch-name。
发布一个版本时,我们通常现在版本库中打一个tag
tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起
在需要打标签的分支上:
git tag
查看所有标签:
git tag
默认标签是打在最新提交的commit上的
如果是以前的没有打,应该在历史提交中找到commit id,然后打上就可以了
git log –pretty=oneline –abbrev-commit
git tagcommit_id
标签不是按时间顺序列出的,而是按照字母排序的
查看标签信息:
git show
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -a
-m “add” commit_id
还可以通过-s用私钥签名一个标签:
git tag -s
-m “add” commit_id
签名采用PGP签名,必须要安装gpg,用PGP签名的标签是不可伪造的,因为可以验证PGP签名
因为创建的标签都只储存在本地,不会自动推送到远程
删除标签:
git tag -d
推送某个标签到远程:
git push origin
一次性推送全部尚未推送到远程的本地标签:
git push origin –tags
删除远程标签:
git push origin :refs/tags/
在Github上,可以任意fork开源仓库
自己拥有fork后的仓库的读写权限
可以推送pull request给官方仓库来贡献代码