Git相关知识
Posted Mario_oo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git相关知识相关的知识,希望对你有一定的参考价值。
Git相关知识(3)
前面2节,主要讲了git的概念和流程,本节主要讲解Git的相关命令。
这里我们先以网上的一张图来展示各个主要的Git命令的联系。
git主要的命令
git config
命令:
使用该命令查看或者配置git。
git config --list
:查看配置文件
git config -edit
:查看或修改配置文件git diff
命令:
该命令用于显示工作目录中当前文件和暂存区暂存的快照之间的差异,也就是修改之后还没有被git add
的内容变化。
git diff
:查看尚未暂存的文件更新了哪些内容。此命令比较的是工作目录(Working tree)和暂存区快照(index)之间的差异。
git diff --cached
:查看暂存区与最新提交版本的差别。
git diff --staged
:查看暂存区与最新提交版本的差别。
git diff HEAD
:查看工作目录和最新提交版本的差别。git add
命令:
使用该命令讲修改的文件添加到暂存区。
git add a.txt
:讲文件a.txt添加到暂存区。
git add *.txt
:将格式为txt的所有文件添加到暂存区。
git add .
:将所有修改添加到暂存区。git status
命令:
该命令用以显示工作目录和暂存区的状态。可以看到那些修改被暂存了,哪些没有,哪些文件没有被Git tracked到。
git status
:检查文件状态。
每次在执行git commit
之前先使用git status
检查文件状态是一个很好的习惯。git commit
命令:
该命令将暂存区的内容进行提交。
git commit xxx
:将已经修改的在暂存区的xxx文件进行提交
git commit -a
:会先把所有已经track的文件的改动git add
进来,然后提交(有点像svn的一次提交,不用先暂存)。对于没有track的文件,还是需要执行git add <file>
命令。git reset
命令:
该命令用于将当前的HEAD
复位到指定状态。一般用于撤销(git add
git commit
)的一些操作。
git reset --hard
:硬回退。该命令会把回退点之前的所有信息都删除掉。
举个栗子:我们把某个文件修改提交了2次,现在该文件处于C状态。
(F)
A-B-C
↑
master
我们输入git reset --hard
就会变为如下:
(F)
A-B
↑
master
C状态彻底被删除了。
git reset --soft
:软回退,只是从当前状态回退到上一个状态。但是其状态不删除。
例如:还是这个场景。
(F)
A-B-C
↑
master
当输入git reset --soft
就会变成如下:
(F)
A-B-C
↑
master
文件状态与分支的指针都指向上一个提交。C状态没有被删除。
git reset --mixed
:混合回退
我们拿栗子说明:还是这个场景。
(F)
A-B-C
↑
master
当我们输入了git reset --mixed
变为如下:
(F)
A-B-C
↑
master
分支指针指向上次的提交,但是文件的状态还是在c状态,即C状态还在,只是没有add,是红色的。
- git branch
命令
该命令用于列出、创建或者删除分支。
git branch
:该命令用于查看当前有哪些分支。
git branch test3
:创建一个新的分支test3
git branch -r
:查看远程分支
git branch -a
:查看本地分支和远程分支。
-git checkout
命令
该命令用于切换分支或者创建分支。
git checkout test3
:切换到test3分支上。
git checkout -b test4
:创建test4分支并切换到该分支上。
git checkout -B test5
:这个命令,可以强制创建新的分支,如果当前仓库中,已经存在一个跟你新建分支同名的分支,那么使用普通的git checkout -b <branch>
这个命令,是会报错的,且同名分支无法创建。如果使用-B
参数,那么就可以强制创建新的分支,并会覆盖掉原来的分支。
git checkout --merge <branch>
:在切换分支的同时将当前分支修改的内容一起打包带走,同步到切换的分支下。
该命令需要注意两个问题(慎用):
1.如果当前分支和切换分支的内容不同的话,容易造成冲突。
2.切换到新的分支后,当前分支修改过的内容就丢失了。
git checkout -p <branch >
:该命令可以用来打补丁。这个命令主要用来比较两个分支间的差异内容,并提供交互式的界面来选择进一步的操作。该命令不仅可以比较两个分支间的差异,还可以比较单个文件的差异。
- git merge
命令
该命令用于将两个或者两个以上的开发历史加入(合并)一起。
git merge test
:讲分支test合并到当前分支中,并自动进行新的提交。
git merge --no -commit maint
:将分支mint合并到当前分支中,但不要自动进行新的提交。
- git log
命令
该命令用于显示提交的日志信息。
git log
:显示历史提交的所有日志信息
git log -3
:显示最近三次的提交信息
git log --no -merges
:显示整个提交历史记录,但是跳过合并
git --since="2 weeks ago" -- gitk
:显示最近两周的更改文件gitk
.--
是必须的,以避免与名为gitk
的分支混淆。
git log commit_id
:查询commit_id
之前的提交记录(包括commit_id
)。commit_id
为提交的哈希值。
git log commit_id commit2_id
:查询commit_id
与commit2_id
之间的记录,包括commit_id
与commit2_id
.
git log commit_id..commit2_id
:同上,但不包括commit_id
。
git log (--pretty=)oneline
:--pretty
按指定格式显示日志信息,可选项有:oneline,short,medium,full,fuller,email,raw以及format
:,默认为medium
,可以通过修改配置文件来指定默认的方式。
常见指定格式有:
#选项 #说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
其中:作者是指最后一次修改文件的人;而提交者是指提交该文件的人。
git rm
命令
该命令用于从工作树(本地实际操作的项目目录)或者索引(文件被add
到的暂存区)中删除文件。
git rm filename
:移除某个文件。
要从git
中移除某个文件,需要先从工作目录中(本地实际操作的项目目录)删除此文件(此时若使用git status
命令查看该状态为changed but not update
),然后再运行git rm filename
则成功删除此文件。(此时若使用git status
命令查看该状态为changed to be committed
).
git rm -f filename
:如果要删除之前已经修改过并add
到了暂存区,则需要使用强制删除选项-f
,注意防止误删文件后丢失内容。
git rm filename --cached
:从暂存区中移除文件,单文件仍然保留在工作目录中。只是不再被版本控制。
git rm \\*~
:递归删除当前目录及其子目录中所有以~
结尾的文件。git mv
命令:
该命令用于移动或重命名文件、目录或符号链接。
git mv text.txt mydir
:将文件text.txt
移动到mydir
中。git fetch
命令:
该命令用于从库中下载对象和引用。若远程跟踪分支已经更新(即该分支有文件被commit
),需要将这些更新取回本地,这时就需要用到此命令。
git fetch
:将某个远程库的更新,全部取回本地。
git fetch origin master
:从远程的origin
仓库的master
分支更新代码到本地的origin的master
git remote
命令
该命令用于管理一组跟踪的远程库。
git remote
:列出已经存在的远程分支
git remote -v
:列出已经存在的远程分支的详细信息。
git remote add [shortname] [url]
添加一个新的远程仓库。[shortname]为新建的远程仓库名 [url]为远程仓库地址。
git cherry
命令:
git cherry -pick <commit_id>
:通常实在分支之间做操作。例如在本地分支上修复bug
,验证无措,在分支上直接commit
,然后切换到master
分支上,使用这条命令捡去分支上的commit
应用到本地的master
分支,最后我们只需在master
分支上执行push
操作。这样做的好处是可以保证master
分支是干净的,没有编译乘车的文件和其他bug
的修改,原则上要求一个commit
对应一个bug
修改。缺点是编译生成的文件大,切换时等待时间长。git rebase
命令
该命令用于把一个分支的修改合并到当前分支。
假设我们基于远程仓库中的分支remote
创建了一个mywork
的分支。我们在mywork
分支上进行了一些修改也commit
了,但同时,也有人将一些修改提交到了远程仓库remote
分支上。这就意味着本地的mywork
分支不是最新的。这时我们有两种方法:
1.git merge
命令,将remote
分支上的修改拉下来并且和本地自己的修改合并,结果看起来就像一个新的合并提交。
2.git rebase
命令,命令会把你的mywork
分支里的每个提交(commit
)取消掉,并且把它们临时 保存为补丁(patch
)(这些补丁放到".git/rebase"
目录中),然后把mywork
分支更新 到最新的remote
分支,最后把保存的这些补丁应用到mywork
分支上。
在rebase
的过程中,也许会出现冲突(conflict
). 在这种情况,Git
会停止rebase
并会让你去解决 冲突;在解决完冲突后,用"git add"
命令去更新这些内容的索引(index
), 然后,你无需执行git commit
,只要执行:git rebase --continue
这样git
会继续应用(apply)
余下的补丁。在任何时候,你可以用--abort
参数来终止rebase
的行动,并且mywork
分支会回到rebase
开始前的状态。即git rebase --abort
。
最后放上网上的2张很好的图,直观的显示了Git的整个流程。
- 参考:Git教程
- 参考:廖雪峰的官方网站
- 参考:Git常见操作流程图
以上是关于Git相关知识的主要内容,如果未能解决你的问题,请参考以下文章