Git 记录

Git 记录

本文是根据 凯子哥 的掘金小册:Git 原理详解及使用指南,记录下的一些笔记,希望不会造成版权上的问题。

链接:Git 原理详解及使用指南

git status:

会显示你当前所在的分支名字 和 当前状态

//返回结果
on branch privatemessage
Your branch is  up-to-date with 'origin/privatemessage'.

Changes not statged for commit:  //没有暂存的 修改文件
...

Untracked files :          // 没有追踪的文件,需要添加进, 则用 git(`git add.`)
...

对于 staging area 的理解: 我理解为暂存区域,即汇集待提交文件的地方。
staging area 是 .git 目录下一个叫做index 的文件, 通过 add指定暂存的内容,都会被写进这个文件里.

HEAD, master, branch 的总结如下:

  1. HEAD是指向当前 commit 的引用, 具有唯一性,每个仓库只有一个head.在每次提交时 它都会自动移动到最新的 commit.

    本地切换分支提交时,会主动把HEAD分支移动到当前分支的最新提交上,但在远端origin上,HEAD永远指向它的默认分支(即master)的最新提交.

  2. branch 是一类引用。HEAD除了直接指向commit, 也可通过指向某个branch来间接指向commit. 当HEAD指向一个branch时,commit发生时,HEAD会随着branch 一起移动。

  3. master 是 git 中默认的branch, 与其他branch的区别在于:

    1. 新建的仓库中的第一个commit会被master自动指向;
    2. git clone 时, 会自动checkoutmaster.
  4. branch 的创建、切换和删除:

    1. 创建 branch的方式是 git branch 名称, 或 git checkout -b 名称 (创建后自动切换)
    2. 切换的方式是 git checkout 名称
    3. 删除的方式是 git branch -d 名称

push 的本质

branch 上传到远端仓库

实质上:把当前branch 的位置(即它指向哪个commit),上传到远端仓库,并把它的路径上的commit s 一并上传。

git checkout feature1
git push origin feature1

git push 多了 origin feature1, 意思是提交到远程的仓库 feature1上面。

小结:

  1. push 是把当前的分支上传到远程仓库, 并把这个branch路径上的所有 commit s 也一并上传;

  2. push 的时候,如果当前分支是一个本地创建的分支,需要指定远程仓库名和分支名, 用git push origin branch_name的格式,而不能只用 git push;, 也可以通过git config 修改push.default 来改变push 时的行为逻辑.

  3. push 的时候,会上传当前分支, 并不会上传head; 远程仓库的head是永远指向默认分支(即master)的.

merge: 合并 commits

pull 的操作其实是把远程仓库取到本地(使用的是fetch

merge 的意思是合并,所处理的事情:

从目标commit 和当前 commit(即HEAD所指向的commit)分叉的位置起,把目标commit上的所有commit的内容一并应用到当前commit, 然后自动生成一个新的commit.

merge的用处更多是体现在当文件冲突时的作用,这个时候需要我们去手动合并代码。

feature branch 为每个功能建立开发分支

  1. 每个新功能都新建一个branch来写;
  2. 写完以后,把代码分享给他人review,没问题后,再去merge 到 develop 分支
  3. 如果要打包上线,则从develop 分支合并到 master去,在master分支上进行打包

有关 git add

总结两点:

  1. git add TestJava.java

    add 后跟的是一个文件名, 这是把这个文件的改动加入到暂存区(利用git status可发现)。

  2. git add .

    git add .
    //是把所有修改过的文件全部放在 暂存区,注意 `add` 后有一个空格
    

git log

git log 是可以查看修改的命令。

git log显示的内容大致如下:

git log 
commit e3a9b6d61edafed214688f3ef5dbe71cf9d44eaa
Author: chenzhao
Date:   Fri Jan 5 21:02:39 2018 +0800
    test for batteryChart

分别是这次提交的SHA值, 是全局唯一的;提交的作者;提交的时间;提交的 commit信息;

另外一般情况下 提交的次数会很多, 退出log 时的命令是: 英文输入法下的 q.按q退出

git log -p;// -p 是

git 常见高级操作

1. rebase 操作 (变基)

git rebase

它 的作用还有待查看

2. 提交的代码错误的是倒数第二个,而不是刚刚提交的代码,如何修改?

git rebase -i HEAD^^

交互式 rebase 最常用的场景是修改写错的 commit , 但也可以用作其他用途,大致用法如下:

  1. 使用方式是 git rebase -i 目标 commit
  2. 在编辑界面完成需要操作的 commit s 以及操作类型;
  3. 操作完成后,用 git rebase --continue 来继续 rebase 过程

3. 刚刚提交的代码,发现有错误,怎么修改?

git commit --amend 命令

amend是修正的意思,在提交时,如果加上--amend参数,Git 不会在当前commit上增加commit, 而是会把当前commit里的内容和暂存区里的内容合并起来后,创建一个新的commit, 利用这个新的commit把当前commit替换掉。

所以, commit --amend 做的事是:对最新一条commit 进行修正。

具体做法如下:

  1. 首先修改代码的错误
  2. 然后在终端里面输入: git add 文件名, 把该修改的文件加进来
  3. 最后,输入 git commit --amend 即可

4. 代码已经 push 上去了,要修改?

当错误的 commit 已经被 push 上去时:

  1. 出错内容 在私有的 branch :, 在本地把内容修正后,强制 push (push -f) 一次就可以解决;

  2. 如果出错内容在 master, 不要强制 push, 而要用 revert 把写错的 commit 撤销

    希望撤销哪个 commit 就把它填在后面:

    git revert HEAD^
    

    revert 完成之后,把新的 commitpush 上去,这个 commit 的内容就被撤销了。

注: 表示有疑问,平时遇到这类问题,并不是这么处理的

5. reset 的本质, 不只可以撤销提交

git reset --hard HEAD^ 

是撤销掉当前最新的 commit

本质: 实际行为并不是撤销,而是移动 HEAD, 并且 捎带上 HEAD 所指向的 branch. 也就是说,reset 这个指令的行为其实和它的字面意思reset 重置十分相符,它是用来重置 HEAD 以及它所指向的 branch 的位置的。

reset --hard HEAD^ 之所以能起到撤销 commit 的效果,是因为它把 HEAD 和它所指向的 branch 一起移到了当前 commit 的父 commit 上, 从而起到了 撤销的效果.

所以同理,reset --hard 不仅可以撤销提交,还可以用来把 HEADbranch 移动到其他的任何地方。

git reset --hard branch2;
//将当前节点移动到 branch2 上面

上面其实出现了两种方式:

  1. git reset 指令可以重置 HEADbranch 的位置,不过在重置他们的过程中,对工作目录可以选择不同的操作,而对工作目录的操作的不同,就是通过 reset 后面跟的参数来确定的。

  2. git reset --hard:

    此时,你的工作目录里的内容会被完全重置为和 HEAD 的新位置相同的内容。换句话说,你的未提交的修改会被全部擦掉.

  3. git reset --soft:

    与上面不同的是, 在重置 HEADbranch 时,保留工作目录和暂存区中的内容,并把重置 HEAD 所带来的新的差异放进暂存区。

  4. git reset 不加参数

    此时,会保留工作目录,并清空暂存区(status).

5. checkout 的本质

6. git stash 临时 存放 工作目录的改动

当你有一件临时工作要做,需要把现在的工作目录暂时清理干净,那么:

git stash

这样,工作目录的改动就被清空了,所有改动都被存了起来。

然后你可以去切换分支,去完成其他的工作。

当你需要再次回到这个分支时,切回你的开发分支, 然后:

git stash pop

这样之前存储的文件都回来了。继续你的修改就可以了。

注意,没有被 track 的文件 (即尚未被 add 的文件)不会被 stash 起来,因为 git 会忽略他们。 如果想把这些文件也一起 stash, 可以加上 -u 参数,它是 --include-untracked 的缩写。

git stash -u

7. git reflog 找回 删掉的branch

reflogreference log 的缩写, 可以查看 Git 仓库中的引用 的移动记录。

git reflog branch1
//会查看有关 branch1 的移动记录

如果不指定 引用, 如下:

git reflog 

//则会默认会显示 `HEAD` 的移动记录。

通过显示的信息:

f989d2086 branch1{0}: commit ....
aeb3a3b45 branch2{1}: pull --log ...
...

通过找到删除的分支对应的 SHA 值,假设为 a3erdf4g6

 git checkout a3erdf4g6
 git checkout -b branch2(分支的名字)

通过切换到某个节点,在该节点上重新去创建一个分支,这样便可得到原来分支上的代码。

8. git .gitignore 排除不想被管理的文件和目录

.gitignore 这个文件 记录了,所有被 Git 忽略的目录和文件.

常用git变换操作

  1. 在某个分支的提交, 同时把这次提交的改变放在另外一个分支上:

    git cherry-pick b7465dne    
    

    说明 后面的数字是commit 的id, 即那次提交的 SHA

  2. 放弃解决冲突,取消merge

    git merge --abort
    

    输入这行代码,你的git仓库 就会回到merge前的状态

  3. 有关 git 中 偏移符号 ^~

    • ^ 的用法:

      commit 后面加一个或多个 ^ 号,可以把 commit 往回偏移,偏移的数量是 ^ 的数量。

      例如: master^ 表示 master 指向的 commit 之前的那个 commit;

      HEAD^^ 表示 HEAD 所指向的 commit 往前数两个 commit.

    • ~ 的用法:

      commit 的后面加上~ 号和一个数,表示把 commit 往回偏移,偏移的数量是 ~号后面的数。 例如: HEAD~5 表示 HEAD 指向的 commit 往前数 5个 commit.

  4. 丢弃最新的提交: reset --hard

    git reset --hard HEAD^
    

    HEAD^ 表示 HEAD 往回数一个位置,也就是你想要恢复到的 commit, 在这行代码后,最新的一条 commit 就被撤销掉了.

    不过,撤销的提交并没有消失,而且不再使用它了,如果记得它的 SHA-1 码, 你就可以通过 SHA-1 找到它。

    --hard: 表示强制执行

  5. 丢弃的是之前的提交 : git rebase -i

    git rebase -i HEAD^^
    
    
  6. 忽略冲突,强制push

    git push origin branch1 -f
    //表示强制push到远端分支 branch1上去
    

    -f 表示 --force 的缩写, 忽略冲突,强制 push

有些尚未明白,水平有限,错误的地方,请大家多交流!

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

推荐阅读更多精彩内容

  • 好友小渔儿是做实体的,赚了钱就理财,小渔儿把一些闲钱买了股票,通过股友的推荐和自己的摸索,在股市上也算是小有成功之...
    星际晓晨阅读 245评论 0 5
  • 书写格式方面 单词书写: 将纸横向对折再对折,把每行隔出4部分。每部分写一个单词,一行写四个,上下对齐。 短句子书...
    Makino_Li阅读 1,039评论 0 0
  • 星期一,小雨 今天早上,窗外下着倾盆大雨。可是,下午太阳很大。 上午,谢老师给我们展示了“机关王”。 中午,我去小...
    Jackie_牛阅读 125评论 0 2