您的位置:首页 > 其它

第一篇博文,其实是日记和笔记【GIT的学习】

2016-08-17 00:01 274 查看
皮肤不很好,心情也是。好闷 啊,快快好起来就好了。

又不睡觉,贼困。

七连跪,戒了戒了。

以下是笔记:

创建仓库成功后,用CD【仓库名】 进入仓库,一层层进入

pwd命令用于显示当前目录

创建一个空目录:

$
mkdir learngit
$
cd learngit
git init命令把这个目录变成Git可以管理的仓库

如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls
-ah命令就可以看见。

1.把文件添加到版本库:

标准的UTF-8编码

用Notepad打开文件

1.第一步,用命令git add告诉Git,把文件添加到仓库:

$
git add readme.txt
第二步,用命令git commit告诉Git,把文件提交到仓库:

$ git
commit -m"wrote a readme file"
[master (root-commit) cb926e7] wrote a readme file
1 file changed,2 insertions(+)
create mode100644 readme.txt

2.时光机穿梭:反悔

2.1修改readme.txt文件

运行git status命令(看的是工作区的改变)看看结果:告诉我们,readme.txt被修改过了,但还没有准备提交的修改

git diff这个命令(查看工作区和版本库里面最新版本的区别)看看:具体修改了什么内容

2.2版本回退

像这样,你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

当然了,在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看最近到最远的提交日志:

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

现在,我们要把当前版本“append GPL”回退到上一个版本“add distributed”,就可以使用git reset命令:

$ git reset --hard HEAD^
HEAD
is nowat ea34578add distributed
但是此时最新版本已经在status 查看列表消失。

但其实没有消失,只要通过git reset命令再加上未来的版本号就可以回去。

版本号没必要写全,前几位就可以了

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append
GPL:

改为指向add distributed:

然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪

当关闭了电脑,又回退了版本,又后悔了,此时用一个命令git reflog用来记录你的每一次命令:

$
git reflogea34578
HEAD@{0}:reset:moving to HEAD^
3628164
HEAD@{1}:commit:append GPL
ea34578 HEAD@{2}:commit:add distributed
cb926e7 HEAD@{3}:commit (initial):wrote a readme filePS:工作区与暂存区的关系

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013745374151782eb658c5a5ca454eaa451661275886c6000

2.X撤销修改:

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。

git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git
checkout命令。

Git同样告诉我们,用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

2.X删除文件:

命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容

3.远程仓库:GitHub

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001374385852170d9c7adf13c30429b9660d0eb689dd43a000

使用前的准备。[SSH]

id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

3.1添加远程仓库

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013752340242354807e192f02a44359908df8a5643103a000

添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

$ git remote add origin git@github.com:【michaelliao】/【learngit】.git

从现在起,只要本地作了提交,就可以通过命令:

$
git push origin master
把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!

////然而我卡在了这一步!

但是莫名其妙成功了

3.2 从远程库克隆

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375233990231ac8cf32ef1b24887a5209f83e01cb94b000

$
git clone git@github.com:michaelliao/gitskills.gitCloning into'gitskills'...remote: Counting objects: 3,
done.remote: Total 3 (delta0),
reused0 (delta0)Receiving objects: 100%
(3/3), done.
$
cd gitskills
$
ls
README.md
Clone = 下载。

4.分支管理:

版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。

HEAD指向的就是当前分支。

4.1:创建与合并分支//切换时间线

1.首先,我们创建dev分支,然后切换到dev分支:

$
git checkout -b dev
Switched to a new branch'dev'
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$
git branch dev$git checkout dev
Switched to branch'dev'
2.然后,用git branch命令查看当前分支:

$
git branch
* dev
master
git branch命令会列出所有分支,当前分支前面会标一个*号。

3.然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:

Creating anew branch is quick.
然后提交:

$
git add readme.txt
$
git commit -m "branch test"
[dev fec145a] branch test
1 file changed,1 insertion(+)
现在,dev分支的工作完成,我们就可以切换回master分支:

$
git checkout master
Switched to branch'master'
切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

4.现在,我们把dev分支的工作成果合并到master分支上:

$
git merge dev
Updating d17efd8..fec145aFast-forward
readme.txt | 1 +
1 file changed,1 insertion(+)
git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

5.合并完成后,就可以放心地删除dev分支了:

$
git branch -d dev
Deleted branch dev (was fec145a).
删除后,查看branch,就只剩下master分支了:

$
git branch
* master
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

小结

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

4.2:解决合并分支的冲突

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840202368c74be33fbd884e71b570f2cc3c0d1dcf000

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

用git log --graph命令可以看到分支合并图。

4.3:分支管理策略

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

.//操作成功,原理蒙蔽。

//而且退不出来了。

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:

小结

Git分支十分强大,在团队开发中应该充分应用。

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast
forward合并就看不出来曾经做过合并。

4.3:Bug分支

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137602359178794d966923e5c4134bc8bf98dfb03aea3000

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git
stash pop,回到工作现场。

4.4Feature(特色,局部)分支

开发一个新feature,最好新建一个分支;

如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

4.5多人协作

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013760174128707b935b0be6fc4fc6ace66c4f15618f8d000

//这个很乱,实践的时候在说

要查看远程库的信息,用git remote:

$
git remote
origin
或者,用git remote -v显示更详细的信息:

$
git remote -v
origin git@github.com:michaelliao/learngit.git
(fetch)
origin git@github.com:michaelliao/learngit.git
(push)
上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。

6.标签管理:

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。

Git有commit,为什么还要引入tag?

“请把上周一的那个版本打包发布,commit号是6a5819e...”

“一串乱七八糟的数字不好找!”

如果换一个办法:

“请把上周一的那个版本打包发布,版本号是v1.2”

“好的,按照tag v1.2查找commit就行!”

所以,tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。

7.使用GitHub

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  git 心情 笔记