技术二三

Git 记录

2018-04-04  本文已影响1人  chendroid

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

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

上一篇 下一篇

猜你喜欢

热点阅读