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
的总结如下:
-
HEAD
是指向当前commit
的引用, 具有唯一性,每个仓库只有一个head
.在每次提交时 它都会自动移动到最新的commit
.本地切换分支提交时,会主动把
HEAD
分支移动到当前分支的最新提交上,但在远端origin
上,HEAD
永远指向它的默认分支(即master
)的最新提交. -
branch
是一类引用。HEAD
除了直接指向commit
, 也可通过指向某个branch
来间接指向commit
. 当HEAD
指向一个branch
时,commit
发生时,HEAD
会随着branch
一起移动。 -
master
是 git 中默认的branch
, 与其他branch
的区别在于:- 新建的仓库中的第一个
commit
会被master
自动指向; - 在
git clone
时, 会自动checkout
出master
.
- 新建的仓库中的第一个
-
branch
的创建、切换和删除:- 创建
branch
的方式是git branch 名称
, 或git checkout -b 名称
(创建后自动切换) - 切换的方式是
git checkout 名称
- 删除的方式是
git branch -d 名称
- 创建
push 的本质
把branch
上传到远端仓库
实质上:把当前branch
的位置(即它指向哪个commit
),上传到远端仓库,并把它的路径上的commit
s 一并上传。
git checkout feature1
git push origin feature1
git push 多了 origin feature1, 意思是提交到远程的仓库 feature1上面。
小结:
-
push
是把当前的分支上传到远程仓库, 并把这个branch
路径上的所有commit
s 也一并上传; -
push
的时候,如果当前分支是一个本地创建的分支,需要指定远程仓库名和分支名, 用git push origin branch_name
的格式,而不能只用git push
;, 也可以通过git config
修改push.default
来改变push
时的行为逻辑. -
push
的时候,会上传当前分支, 并不会上传head
; 远程仓库的head
是永远指向默认分支(即master
)的.
merge: 合并 commits
pull
的操作其实是把远程仓库取到本地(使用的是fetch
)
merge
的意思是合并,所处理的事情:
从目标commit
和当前 commit
(即HEAD
所指向的commit
)分叉的位置起,把目标commit
上的所有commit
的内容一并应用到当前commit
, 然后自动生成一个新的commit
.
merge
的用处更多是体现在当文件冲突时的作用,这个时候需要我们去手动合并代码。
feature branch 为每个功能建立开发分支
- 每个新功能都新建一个
branch
来写; - 写完以后,把代码分享给他人review,没问题后,再去merge 到 develop 分支
- 如果要打包上线,则从develop 分支合并到 master去,在master分支上进行打包
有关 git add
总结两点:
-
git add TestJava.java
add 后跟的是一个文件名, 这是把这个文件的改动加入到暂存区(利用
git status
可发现)。 -
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
, 但也可以用作其他用途,大致用法如下:
- 使用方式是
git rebase -i 目标 commit
- 在编辑界面完成需要操作的
commit
s 以及操作类型; - 操作完成后,用
git rebase --continue
来继续rebase
过程
3. 刚刚提交的代码,发现有错误,怎么修改?
git commit --amend
命令
amend
是修正的意思,在提交时,如果加上--amend
参数,Git
不会在当前commit
上增加commit
, 而是会把当前commit
里的内容和暂存区里的内容合并起来后,创建一个新的commit
, 利用这个新的commit
把当前commit
替换掉。
所以, commit --amend
做的事是:对最新一条commit
进行修正。
具体做法如下:
- 首先修改代码的错误
- 然后在终端里面输入:
git add 文件名
, 把该修改的文件加进来 - 最后,输入
git commit --amend
即可
4. 代码已经 push 上去了,要修改?
当错误的 commit
已经被 push
上去时:
-
出错内容 在私有的
branch
:, 在本地把内容修正后,强制push (push -f)
一次就可以解决; -
如果出错内容在
master
, 不要强制push
, 而要用revert
把写错的commit
撤销希望撤销哪个
commit
就把它填在后面:git revert HEAD^
在
revert
完成之后,把新的commit
再push
上去,这个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
不仅可以撤销提交,还可以用来把HEAD
和branch
移动到其他的任何地方。git reset --hard branch2; //将当前节点移动到 branch2 上面
上面其实出现了两种方式:
-
git reset
指令可以重置HEAD
和branch
的位置,不过在重置他们的过程中,对工作目录可以选择不同的操作,而对工作目录的操作的不同,就是通过reset
后面跟的参数来确定的。 -
git reset --hard
:此时,你的工作目录里的内容会被完全重置为和
HEAD
的新位置相同的内容。换句话说,你的未提交的修改会被全部擦掉. -
git reset --soft
:与上面不同的是, 在重置
HEAD
和branch
时,保留工作目录和暂存区中的内容,并把重置HEAD
所带来的新的差异放进暂存区。 -
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
reflog
是 reference 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
变换操作
-
在某个分支的提交, 同时把这次提交的改变放在另外一个分支上:
git cherry-pick b7465dne
说明 后面的数字是commit 的id, 即那次提交的 SHA
-
放弃解决冲突,取消merge
git merge --abort
输入这行代码,你的git仓库 就会回到
merge
前的状态 -
有关
git
中 偏移符号^
和~
-
^
的用法:在
commit
后面加一个或多个^
号,可以把commit
往回偏移,偏移的数量是^
的数量。例如:
master^
表示master
指向的commit
之前的那个commit
;HEAD^^
表示HEAD
所指向的commit
往前数两个commit
. -
~
的用法:在
commit
的后面加上~
号和一个数,表示把commit
往回偏移,偏移的数量是~
号后面的数。 例如:HEAD~5
表示HEAD
指向的commit
往前数 5个commit
.
-
-
丢弃最新的提交:
reset --hard
git reset --hard HEAD^
HEAD^
表示HEAD
往回数一个位置,也就是你想要恢复到的commit
, 在这行代码后,最新的一条commit
就被撤销掉了.不过,撤销的提交并没有消失,而且不再使用它了,如果记得它的
SHA-1
码, 你就可以通过SHA-1
找到它。--hard
: 表示强制执行 -
丢弃的是之前的提交 :
git rebase -i
git rebase -i HEAD^^
-
忽略冲突,强制push
git push origin branch1 -f //表示强制push到远端分支 branch1上去
-f
表示--force
的缩写, 忽略冲突,强制push
有些尚未明白,水平有限,错误的地方,请大家多交流!
网友评论