git总结

=======================版本回退===============================
readme.txt(one、add2、add3版本的内容如下)
 hello world       one 
 hello world 2     add2
 hello world 3     add3
[root@localhost repotest]# git log --pretty=oneline
311970aa676a3efa30f018a1079e6f093dad0b53 add 3
73b3b44fcbcf4b94577bf708d91b8c79295195dc add 2
f3bab092683efbb5f1600002e17d4960f13d5133 one

[root@localhost repotest]# ls
readme.txt

[root@localhost repotest]# git reset --hard HEAD^ (上一个版本就是HEAD^,上上一个版本就是HEAD^^,
当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。)
HEAD is now at 73b3b44 add 2
[root@localhost repotest]# cat readme.txt 
hello world
hello world 2
[root@localhost repotest]# 

在Git中,总是有后悔药可以吃的。当你用$git reset --hard HEAD^回退到add distributed版本时,
再想恢复到append GPL,就必须找到append GPL的commit id。Git提供了一个命令git reflog用来记
录你的每一次命令:
[root@localhost repotest]# git reflog
73b3b44 HEAD@{0}: reset: moving to HEAD^
311970a HEAD@{1}: commit: add 3
73b3b44 HEAD@{2}: commit: add 2
f3bab09 HEAD@{3}: commit (initial): one
现在总结一下:

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

穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
=================工作区和暂存区========================
图 版本库

在工作区新增一个LICENSE文本文件(内容随便写)。
先用git status查看一下状态:
[root@localhost repotest]# vim license
git 1
[root@localhost repotest]# git status
 On branch master
 Untracked files:
   (use "git add <file>..." to include in what will be committed)

    license
nothing added to commit but untracked files present (use "git add" to track)
[root@localhost repotest]# git add license (license就放到暂存区了)
[root@localhost repotest]# git status
 On branch master
 Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   license
[root@localhost repotest]# git commit -m "1" license (放到了master)
[master 37443a9] 1
 1 file changed, 1 insertion(+)
 create mode 100644 license
[root@localhost repotest]# git status
# On branch master
nothing to commit, working directory clean
==================管理修改=================================
第一次修改 -> git add -> 第二次修改 -> git commit
在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,
也就是第一次的修改被提交了,第二次的修改不会被提交。
经实验第二次修改的也提交上去了(??)

那怎么提交第二次修改呢?
第一次修改 -> git add -> 第二次修改 -> git add -> git commit
===========================撤销修改====================
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
[root@localhost repotest]# cat readme.txt 
hello world
hello world 2
boss sb
[root@localhost repotest]# 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
#

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

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前
提是没有推送到远程库。
==========================删除文件==============================
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,
但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
[root@localhost repotest]# vim test.txt
[root@localhost repotest]# git add test.txt 
[root@localhost repotest]# git commit -m "add test.txt"
[master 5beda0e] add test.txt
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
[root@localhost repotest]# rm test.txt
rm: remove regular file ‘test.txt’? y
[root@localhost repotest]# ls
license  readme.txt
[root@localhost repotest]# git status
# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    test.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@localhost repotest]# git rm test.txt
rm 'test.txt'
[root@localhost repotest]# git commit -m "remove test.txt"
[master 1506a3f] remove test.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt
=======================分支=========================
Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

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

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

删除分支:git branch -d <name>
=======================解决冲突=====================================
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/
001375840202368c74be33fbd884e71b570f2cc3c0d1dcf000
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

图冲突1

首先,仍然创建并切换dev分支:

$ git checkout -b dev
Switched to a new branch 'dev'
修改readme.txt文件,并提交一个新的commit:

$ git add readme.txt 
$ git commit -m "add merge"
[dev f52c633] add merge
 1 file changed, 1 insertion(+)
现在,我们切换回master:
====================分支管理策略==================================
$ git checkout master
Switched to branch 'master'
准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward:

$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
 readme.txt | 1 +
 1 file changed, 1 insertion(+)
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

合并后,我们用git log看看分支历史:

$ git log --graph --pretty=oneline --abbrev-commit
*   e1e9c68 (HEAD -> master) merge with no-ff
|\  
| * f52c633 (dev) add merge
|/  
*   cf810e4 conflict fixed
...
可以看到,不使用Fast forward模式,merge后就像这样:
33333333

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

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

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

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

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

======================修复bug================================
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,
再git stash pop,回到工作现场。
===================开发一个新feature=========================
开发一个新feature,最好新建一个分支;

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

==================多人协作================================
多人协作的工作模式通常是这样:

首先,可以试图用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,如果有冲突,要先处理冲突。
=============================创建标签===========================
在Git中打标签非常简单,首先,切换到需要打标签的分支上:
$ git branch
* dev
  master
$ git checkout master
Switched to branch 'master'
然后,敲命令git tag <name>就可以打一个新标签:

$ git tag v1.0
可以用命令git tag查看所有标签:

$ git tag
v1.0
创建标签
阅读: 257248
在Git中打标签非常简单,首先,切换到需要打标签的分支上:

$ git branch
* dev
  master
$ git checkout master
Switched to branch 'master'
然后,敲命令git tag <name>就可以打一个新标签:

$ git tag v1.0
可以用命令git tag查看所有标签:

$ git tag
v1.0
默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经
是周五了,但应该在周一打的标签没有打,怎么办?

方法是找到历史提交的commit id,然后打上就可以了:

$ git log --pretty=oneline --abbrev-commit
12a631b (HEAD -> master, tag: v1.0, origin/master) merged bug fix 101
4c805e2 fix bug 101
e1e9c68 merge with no-ff
f52c633 add merge
cf810e4 conflict fixed
5dc6824 & simple
14096d0 AND simple
b17d20e branch test
d46f35e remove test.txt
b84166e add test.txt
519219b git tracks changes
e43a48b understand how stage works
1094adb append GPL
e475afc add distributed
eaadf4e wrote a readme file
比方说要对add merge这次提交打标签,它对应的commit id是f52c633,敲入命令:

$ git tag v0.9 f52c633
再用命令git tag查看标签:

$ git tag
v0.9
v1.0
注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息:

$ git show v0.9
commit f52c63349bc3c1593499807e5c8e972b82c8f286 (tag: v0.9)
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 21:56:54 2018 +0800

    add merge

diff --git a/readme.txt b/readme.txt
...
可以看到,v0.9确实打在add merge这次提交上。

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

$ git tag -a v0.1 -m "version 0.1 released" 1094adb
用命令git show <tagname>可以看到说明文字:

$ git show v0.1
tag v0.1
Tagger: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 22:48:43 2018 +0800

version 0.1 released

commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (tag: v0.1)
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 21:06:15 2018 +0800

    append GPL

diff --git a/readme.txt b/readme.txt
...
 注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又
出现在dev分支,那么在这两个分支上都可以看到这个标签。
小结
命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;

命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
==============================删除标签================================
小结
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
然后,从远程删除。删除命令也是push,但是格式如下:
命令git push origin <tagname>可以推送一个本地标签;

命令git push origin --tags可以推送全部未推送过的本地标签;

命令git tag -d <tagname>可以删除一个本地标签;

命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
命令git tag可以查看所有标签。

版本库.png

冲突1.png
冲突2.png
3.png

由于git init –bare 方法创建一个裸仓库,在该仓库无法进行任何git操作,所以抛出错误.

解决方法:在该仓库目录下,新建文件夹,进入该文件夹,执行如下命令:
1. touch Readme
2. git init
3. git add Readme
4. git commit -m 'initial commit' Readme
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

  • Git 在上家公司时使用git管理代码,当时使用的稀里糊涂,有些地方不是太明白。现在这家公司把代码移到git上管理...
    圆土豆阅读 571评论 0 50
  • threetowns阅读 249评论 0 0
  • 安装与配置 1.git下载 2.安装过程中全部默认下一步都没有问题。 3.基本配置用户名和邮箱右键git bash...
    时代小召唤阅读 334评论 0 0
  • 关于git,之前总是遇到什么问题然后做了一个简单总结。今天决定来一个系统的总结,加深一下自己对git的理解。 1、...
    丶灰太狼他叔阅读 586评论 2 0
  • 今天学习生物的时候,有一句话,说是下丘脑是体温调节中枢,自己就会在下丘脑在哪里这个地方纠结。但仔细想想,这不是问题...
    鸭梨山大哎阅读 161评论 0 1