很久以前练习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

Bug分支

在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分支

每添加一个新功能,最好新建一个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 <name>

查看所有标签:

git tag

默认标签是打在最新提交的commit上的
如果是以前的没有打,应该在历史提交中找到commit id,然后打上就可以了

git log –pretty=oneline –abbrev-commit
git tag <name> commit_id

标签不是按时间顺序列出的,而是按照字母排序的
查看标签信息:

git show <tagname>

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字

git tag -a <tagname> -m “add” commit_id

还可以通过-s用私钥签名一个标签:

git tag -s <tagname> -m “add” commit_id
签名采用PGP签名,必须要安装gpg,用PGP签名的标签是不可伪造的,因为可以验证PGP签名

操作标签

因为创建的标签都只储存在本地,不会自动推送到远程
删除标签:

git tag -d <tagname>

推送某个标签到远程:

git push origin <tagname>

一次性推送全部尚未推送到远程的本地标签:

git push origin –tags

删除远程标签:

git push origin :refs/tags/<tagname>

使用Github

在Github上,可以任意fork开源仓库
自己拥有fork后的仓库的读写权限
可以推送pull request给官方仓库来贡献代码


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6