您的当前位置:首页正文

Git 学习笔记 I

来源:华拓网

<h4>创建版本库
<h6>三条命令轻松解决

<pre>1. $git init

  1. $git add File_Name
  2. $git commit -m "" # ""中是提交附带的注释信息方便下次查看</pre>

<h4>回望过去

<pre>$ git status

On branch master

Changes not staged for commit:

(use "git add <file>..." to update what will be committed)

(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.txt

no changes added to commit (use "git add" and/or "git commit -a")</pre>

<h6>注:git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改.

<pre>$ git diff readme.txt diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software</pre>

<h6>注:git diff 顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个“distributed”单词

<h4>回到过去

 add distributed</p>

<h6>注:git log 命令显示从最近到最远的提交日志,我们可以看到2次提交,最近的一次是add distributed,最早的一次是wrote a readme file。

<h6>加上--pretty=oneline参数,显得更简洁些.
<pre>$ git log --pretty=oneline
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file</pre>

<h6>在Git中,用HEAD表示当前版本 上一个版本就是HEAD^ 上上一个版本就是HEAD^^ 当然往上100个版本写成HEAD~100

<code>git reset --hard HEAD^ </code> 回退至上一个版本
<code>git reset --hard 3628164 </code> 回到指定commit id

当你记不得commit id时,这是<code>git reflog</code>可以用来记录你的每一次命令。

<pre>1. HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id.

  1. 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
  2. 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。</pre>

<h4>工作区和暂存区概念
<h6>话不多说,3张图全搞定。(这个搞懂很重要)

0.jpg 0 (1).jpg 0 (2).jpg

<h4>撤销修改
1.<pre>$ git checkout -- readme.txt</pre>
<h6>把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

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

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

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

假如已经将修改提交到暂存区,即已经执行过<code>git add</code>过.

先执行<code>git reset HEAD readme.txt</code>
<pre>$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt</pre>

<code>git reset HEAD file</code> 可以把暂存区的修改撤销掉(unstage),重新放回工作区.
<code>git reset</code>命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

再执行<code>$ git checkout -- readme.txt</code>.将工作区的修改撤销
<pre>场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。

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

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

<h4>删除文件
<pre>$ git add test.txt
$ git commit -m "add test.txt"
$ rm test.txt
$ git status # 工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了

$ git rm test.txt #确实要从版本库中删除该文件,那就用命令git rm删掉
$ git commit -m "remove test.txt" 从版本库中删除该文件<p>
$ git checkout -- test.txt # 或者把误删的文件恢复到最新版本</pre>

<h4>创建与合并分支
<h6>创建与合并分支原理,几张图清晰明了!

master主分支 HEAD指针指向master 创建dev分支 同时HEAD指针改为指向dev分支 在head分支上提交 合并分支 删除dev分支

命令示例
<pre>$ git checkout -b dev #创建dev分支
$ git branch #查看当前分支 * 号表示正处于哪个分支上
$ git add readme.txt
$ git commit -m "branch test" #提交到dev分支</pre>

<pre>$ git checkout master #切回主分支
$ git merge dev #合并dev分支到主分支
$ git branch -d dev #删除dev分支,结束
</pre>

小结:
<pre>查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

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

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

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

<h4>解决合并分支时的冲突情况
<h6>冲突情景再现
<pre>$ git checkout -b feature1
$ echo "Creating a new branch is quick AND simple." >> readme.txt
$ git add readme.txt
$ git commit -m "AND simple"</pre>

<pre>$ git checkout master
$ echo "Creating a new branch is quick $ simple."
$ git add readme.txt
$ git commit -m "& simple"</pre>

冲突出现
<pre>$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.</pre>

原理解释 一张图搞定

合并冲突(注意与前面正常合并图的区别)

查看readme.txt文件内容
<pre>Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.

feature1</pre>

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容

手动修改readme.txt文件,改后文件内容如下
<pre>Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
Creating a new branch is quick and simple.</pre>

修改完后再提交
<pre>$ git add readme.txt
$ git commit -m "conflict fixed"
[master 59bc1cb] conflict fixed
$ git branch -d feature1</pre> #删除feature1分支

解决冲突后图示

冲突解决后

使用<code>git log</code>查看分支合并情况
<pre>$ git log --graph --pretty=oneline --abbrev-commit
* 59bc1cb conflict fixed
|
| * 75a857c AND simple
* | 400b400 & simple
|/

  • fec145a branch test</pre>

<h4>分支管理策略(不使用Fast forward模式)
<h6>通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

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

代码演示:
<pre>$ git checkout -b dev
$ vim readme.txt #这里往readme.txt文件中追加任意内容即可
$ git add readme.txt
$ git commit -m "add merge"
$ git checkout master
$ git merge --no-ff -m "merge with no-ff" dev #--no-ff不使用ff模式
$ git log --graph --pretty=oneline --abbrev-commit #查看合并图</pre>

不使用ff模式的合并(注意与前面两张图的区别)

<h4>当出现bug时...
<h6>当你在进行手头上的coding任务时,突然leader让你去搞定一个bug代码,这时你手上的代码又还没提交,心里肯定有1W只草泥马奔过。。。别怕!Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。
<pre>$ git stash #把手头的工作现场存储起来,方便之后还原
$ git status #查看工作区是否干净,干净的可进行下一步
$ git checkout master #假设需要在master主分支上修复
$ git checkout -b bug #创建临时分支
$ git add readme.txt #修改readme.txt文件并提交(这里我没有演示修改readme.txt文件)
$ git commit -m "fix bug"
$ git checkout master
$ git merge --no-ff -m "merged bug fix" bug #合并分支
$ git branch -d bug
$ git checkout dev #回到dev分支(原来的手头工作)
$ git status #发现是干净的,不对啊,怎么玩?
$ git stash list #查看当时工作现场暂存到哪儿了
$ git stash pop #恢复工作现场,同时将stash存储的内容删除</pre>

推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上
<pre>$ git push origin master</pre>

<h4>标签管理
<h6>创建标签

首先切换到要打标签的分支上
<pre>$ git checkout master</pre>

然后,敲命令,<code>git tag <name></code>就可以打一个新标签:
<pre>$ git tag v1.0</pre>

可以用命令<code>git tag</code>查看所有标签

也可以根据commit_id来打标签。
<pre>$ git log --pretty=oneline --abbrev-commit
6a5819e merged bug fix 101
cc17032 fix bug 101
7825a50 merge with no-ff
6224937 add merge
59bc1cb conflict fixed
400b400 & simple
75a857c AND simple
fec145a branch test
d17efd8 remove test.txt</pre>

选择你想打标签的那次commit操做,选取对应commit_id
<pre>$ git tag v0.9 6224937</pre>

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
<pre>$ git tag -a v0.1 -m "version 0.1 released" 3628164</pre>

version 0.1 released

<h4>操做标签
<h6>删除标签
<pre>$ git tag -d v0.1</pre>

  • [new tag] v1.0 -> v1.0</pre>
  • [new tag] v0.2 -> v0.2
  • [new tag] v0.9 -> v0.9</pre>

删除远程标签

先从本地删除 <code>$ git tag -d v0.9</code>
再从远程删除 <code>$ git push origin :refs/tags/v0.9</code>

<h3>结束啦!洗洗睡了!