Git 常用指令汇总
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage, 或 index。一般存放在 “.git 目录下” 下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录。git,这个不算工作区,而是 Git 的版本库。
1 介绍
先通过几张图片来大致了解一下 Git 的工作原理吧!
文章开头的流程图已经简单明了地说明了 Git 常用操作的工作流程,下图换种风格再展示一次:
提到 Git 就会联想到 github, 下图从 Git 的角度简单说明了一些 Github 常用操作的关系:
下面这个图则展示了工作区、版本库中的暂存区和版本库之间的关系:
图中左侧为工作区,右侧为版本库。在版本库中标记为 "index"
的区域是暂存区(stage, index),标记为 “master” 的是 master 分支所代表的目录树。
HEAD 指针:每个 git 仓库有且仅有一个 HEAD 指针,它通常指向當前某个活動的本地分支指针(最初本地仓库 master)。也可以是某个提交记录、某个 tag,但这会让其处于 detached HEAD(游离头)状态,此状态下的所有提交都无效。
图中我们可以看出此时 "HEAD"
实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
图中的objects
标识的区域为 Git 的对象库,实际位于 ".git/objects"
目录下,里面包含了创建的各种对象及内容。
当对工作区修改(或新增)的文件执行 "git add"
命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的 ID 被记录在暂存区的文件索引中。
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
当执行 "git reset HEAD"
命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
当执行 "git rm --cached <file>"
命令时,会直接从暂存区删除文件,工作区则不做出改变。
当执行 "git checkout ."
或者 "git checkout -- <file>"
命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
当执行 "git checkout HEAD ."
或者 "git checkout HEAD <file>"
命令时,会用 HEAD
指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
2 Git 配置
|
|
2.1 基本操作
|
|
当某一次提交后,突然想起漏提交了文件,或不小心提交了不满意的代码时,
可以使用
git commit --amend -m "message"
指令。它可以在不增加一个新的 commit-id 的情况下将新修改的代码追加到前一次的 commit-id 中。提交之后 message 也将被本次的 message 覆盖,所以还需要再次添加上次的 message。2.2 push
|
|
把当前 master 分支推送到远程库;
-u
表示记住分支和地址,下次使用git push
即可。
2.3 remote
|
|
2.4 clone
|
|
2.5 pull
|
|
从远程仓库拉下来到本地库然后合并相当于
git fetch
+git merge
。
一般 push 前先拉去最新版本,避免代码冲突,如果有冲突需要解决了冲突才能提交。
import repositories 同步更新
|
|
2.6 fetch
|
|
fetch 是从远程库到本地库,但是未在工作区,需要
git merge
2.7 merge
|
|
分支合并也是在本地完成 (从本地库到工作区),新的分支只有在合并后才允许被删除。
如果分支合并是出现冲突需要解决了冲突才能合并,使用git status
查看冲突文件。
2.8 branch,checkout
|
|
git checkout -- file
相当于取消对文档的修改,将最新的本地版本库的本文件复制覆盖它。(比较危险!)
2.9 reflog,log
|
|
想看到自己的操作记录,则可以使用 log 与 reflog,它两个的区别如下:
git log
命令可以显示所有提交过的版本信息; 如果感觉太繁琐,可以加上参数--pretty=oneline
,只会显示版本号和提交时的备注信息。git reflog
可以查看所有分支的所有操作记录。(包括已经被删除的 commit 记录和 reset 的操作)
2.10 reset
|
|
版本退回是从本地仓库到暂存区,如果已经提交远程库,此时的版本是低于最新的版本的会拒绝提交, 需要用
git push -f origin master
强制提交。
如果你git reset --hard HEAD^
+git push -f origin master
执行完,github 中的记录和本地文件都会回到退回的状态。简单来说就是一修改了一天的 bug, 完工后,你这一套操作直接打回原形。别慌(实际内心慌的一麻皮。)
- 通过
git log -g
命令来找到需要恢复的信息对应的 commitid,可以通过提交的时间和记录来辨别, 找到执行reset --hard
之前的那个 commit 对应的 commit-id - 通过
git branch recover_branch commit-id
来建立一个新的分支
这样,就把到 commitid 为止的代码、各种提交记录等信息都恢复到了 recover_branch 分支上了。
2.11 status
|
|
查看你的文件在暂存区和工作目录的状态,默认是较为详细的显示,并提示你可以用何种命令完成你接下来可能要做的事情。
|
|
较为简单的输出当前的状态,如:
|
|
你可以看到,在简短输出中,有两栏。第一栏是暂存区的,第二栏则是工作目录的。这里表示:
README.md
在暂存区中的状态是modify
hello.rb
在工作目录中的状态是delete
world.java
还未添加到版本控制。
2.12 diff
|
|
2.13 rm, mv
|
|
git rm
用来删除文件、目录。git mv
命令用于移动或重命名一个文件、目录。
比如删除 photos 文件,本地删除后,远程仓库还会有,所以
|
|
2.14 submodule
|
|
init
和update
才行。
或者使用递归克隆git clone --recursive 远程库
子模组更新后,父模组必须更新,因为需要更新 commit id。
2.15 tag
|
|
git tag -a
命令时,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。
如果我们忘了给某个提交打标签,又将它发布了,我们可以给它追加标签。例如,假设我们发布了提交 85fc7e7(最后一行),但是那时候忘了给它打标签。我们现在也可以:
|
|
2.16 stash
|
|
2.17 gitk
|
|
3 github,gitea 等平台 issue 的常用标签
bug
描述的问题是一个 bugenhancement
功能增强,没有 feature 也可以指 New feature or requestfeature
新功能duplicate
问题重复invalid
可用的,不是 bugquestion
疑问,需要进一步的信息wontfix
不会修复此问题help-wanted
需要帮助good first issue
Good for newcomers- 更多标签