Git 记录

作者: chendroid | 来源:发表于2018-04-04 20:35 被阅读1次

    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

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

    相关文章

      网友评论

        本文标题:Git 记录

        本文链接:https://www.haomeiwen.com/subject/ajylhftx.html