git笔记

git中常用的包括5个部分:工作区(即工作目录),贮藏区,暂存区,本地仓库,远程仓库。它们之间的关系如下图:

贮藏

贮藏就是将工作区中已修改但是未暂存的内容放入贮藏区中保存起来,将工作区变成干净的、没有任何修改的状态,此时就可以进行其他的修改或者进行分支切换了。等事情忙完提交后又可以将贮藏区中的内容应用到工作区中继续进行修改了。

git stash:默认参数是save,即保存修改到贮藏区,执行git stash等同于git stash save。

git stash list:查看贮藏的记录,执行一次git stash就会产生一条记录,注意此命令并不能直接查看贮藏区中文件的具体修改内容。

git stash apply [stashname]:默认应用贮藏区中最近一次贮藏的内容到工作区,也可以指定应用某次贮藏的内容。

git stash drop [stashname]:默认删除贮藏区中最近一次贮藏的内容,也可以指定删除某次贮藏的内容。

暂存

暂存就是将工作区中修改或添加的内容保存到暂存区,并用于稍后提交到本地仓库中,此时工作区就会变成干净的了,当发现暂存的内容与我们想要提交的内容不一致时,也可以取消暂存的内容重新修改后再暂存提交。

git add filename/dirname:将工作区的指定文件或者指定目录下的所有文件添加到暂存区。执行“git add .”表示暂存当前目录下的所有。

git rm --cached filename/dirname:取消暂存,可以指定文件或目录。

提交

提交就是将暂存区中的内容提交到本地仓库中,需要注意的是不能直接提交工作区中的内容,一些软件的提交操作看似是勾选文件后就可以一步提交,其实也是执行了add和commit两个步骤。提交之后就产生了一个新的版本,如果发现提交的内容有问题,可以使用回滚提交,重新修改后再次提交即可。

git的每一次提交其实就是一次快照,也就是一个新的版本,这个版本(提交)指向的就是此次提交对应的快照,快照即每个版本保存的是整个文件的所有内容,而不是只有修改的那部分内容。也就是说,如果某个文件此次提交没有修改,则保存的是指向它最近一次修改提交的索引,如果此次提交有修改,则保存的是此文件的全部内容。

git commit [-m "message"]:提交暂存区中的内容,如果不加-m参数,git将会跳转到一个编辑窗口,这个窗口会显示你将要提交的内容,并要求你填写提交信息。加了-m这个参数后就会直接进行提交,并不会显示将要提交的内容等信息,message是提交时需要填写的提交信息。

git commit --amend -m "message":重新填写上次提交的提交信息,如果提交后发现提交信息填写错了,可以使用这个命令重新填写。

git revert commitcode:回滚提交,会将指定提交码提交的内容回滚并应用于工作区和暂存区,并重新产生一个提交。

差异比较

差异的比较一般使用一些git的图形化软件会更加的直观和方便,当然,喜欢使用命令的人也看个人习惯了。

git diff [filename/dirname]:会将工作区和暂存区的内容进行比较。

git diff --cached [filename/dirname]:将暂存区的内容与本地仓库的内容进行比较。

git diff HEAD:直接比较工作区和本地仓库的内容。

检出

git checkout --filename/dirname:将暂存区的内容同步到工作区中,即工作区中即使有内容,并且和暂存区中不一致,也会被暂存区的内容覆盖。

git checkout HEAD:将本地仓库的内容同步到工作区和暂存区中,即工作区和暂存区中即使有内容,并且和本地仓库中不一样,也会被本地仓库的内容覆盖。

重置

git reset -- filename/dirname:重置暂存区中的内容,会将暂存区中的指定文件或者指定目录下的所有文件删除,而工作区中的内容不会变动,即重置文件或目录的暂存状态,执行“git reset -- .”表示重置所有。一般来讲,工作区中的内容和暂存区中的内容是一致的,如果不一致,即暂存文件后,又对此文件进行了修改,那么此命令只是删除暂存的记录,不会修改工作区中的内容。

git reset --hard commitcode:强制重置当前分支(工作区,暂存区以及本地仓库)到指定提交码的版本状态,由于重置之后不可逆,此命令需慎用!

合并分支

分支就是基于另一个分支的某次提交进行自己的开发,从而产生不同的提交记录,并且不同的分支的提交更新是互不干扰的。

如果两个分支需要合并,则需要这两个分支拥有共同的基,如下图,master分支和develop分支共同的基为v2,而master分支和bug分支共同的基为v3。

分支合并从原理上来讲就两种方式:快进式和解决冲突合并。从提交记录上来看,除了这两种方式,其实还有一种变基式合并,但是这种方式使用的情况比较少。

快进Fast-forward即合并的两个分支,一个分支上相较于另一个分支上从基开始是没有变过的,但是也会产生一个新的提交记录,如下图:

 解决冲突:当某个文件在两个分支上都进行了修改,则会提示冲突,需要手动解决冲突后作为新的提交和版本合入其中一个分支,如下图:

 变基rebase:将一个分支的基直接变为另一个分支最新的版本,然后再将此分支之前的所有提交在最新的基上重新执行一遍,然后再以快进式的方式合入另一个分支。这种方式在提交记录是上看着就会比较直观,因为只有“一条直线“的记录,并没有产生新的用于合并的提交记录。需要注意的是如果某个文件在变基时的重新提交存在冲突,那么冲突多少次就需要解决冲突多少次。

git branch branchname [basebranch]:默认基于当前分支创建新分支,也可以指定基于某个特定的分支。

git branch -v:查看所有分支。

git branch -vv:查看所有分支,及其跟踪的远程分支。

git checkout branchname:检出并切换到指定分支,如果本地没有对应分支,但是远程有对应分支,则会自动在本地创建该分支。

git checkout -b branchname:创建一个新分支,并切换到该分支。

git merge branchname:将指定分支上的内容直接合并到当前分支上,最终的合并结果会产生一个新的提交。

git branch -d branchname:删除指定分支。

git cherry-pick commitcode:将其他分支的某次提交的内容合并到当前分支上。

git rebase [--onto newbase] startbranch [branchname]:rebase方式合并分支,rebase就是变基的意思,--onto newbase 默认和startbranch一致,branchname默认就是HEAD,即当前分支,此命令的作用是将当前分支或指定分支的“基”变为另一个分支的最新提交,原理是:

第一步,切换分支到branchname,第二步,将branchname切换到newbase上,成为新的branchname,第三步,在新branchname上重新提交原branchname执行过的所有提交(如果存在冲突则需要解决冲突)。例如使用rebase方式将dev分支合并到master上,可以执行以下命令:

  • 切换分支到dev上,即HEAD为dev分支。
  • 执行git rebase master:此时,newbase和startbranch指向的都是master,并且dev的“基”已经变为master的最新的一次提交了,而不是当初新建分支时的提交了。然后就会执行dev的所有提交,直到解决掉所有提交的冲突并完成提交。
  • 执行git checkout master。
  • 执行git merge dev:此时的合并其实就是快进式的合并操作了。

手动解决冲突

一个分支合并到另一个分支上时,如果存在冲突,需要解决冲突后重新执行git addgit commit命令,解决冲突时,如果是文本,冲突的地方会被======将两个分支的内容分开,<<<<<<<HEAD表示当前分支的内容,>>>>>>>[branchname]表示另一个分支的内容。

推送拉取

平常工作中,我们一般都会使用到远程仓库,便于整个团队的协同工作。这时候就需要我们将本地仓库与远程仓库进行同步,可以让你知道别人改了什么内容,也可以让别人知道你改了什么内容。

git clone xxx.git:从远程仓库克隆一个项目到本地作为本地仓库,即下载一个项目的副本到本地。

git pull:从远程仓库的内容拉取并合入本地仓库。

git push:将本地仓库的内容推送并合入到远程仓库。

其他常用命令

git init [dirname]:版本初始化,在一个文件夹下执行这个命令表示会将这个文件夹下的内容设置为初始的git版本,即本地仓库版本。如果指定了文件夹名称,将会以指定的文件夹为本地仓库,如果指定的文件夹不存在则会自动创建。

git config user.name "名称":配置用户名,也可以通过git config user.name查看用户名。

git config user.email "邮箱地址":配置用户邮箱地址,也可以通过git config user.email查看用户邮箱地址。

git status [-u]:状态查询,查看当前git库中的修改跟踪情况,加了-u参数后,将会显示详细的跟踪情况。

git log:默认显示所有提交日志信息,可以使用其他参数显示特定的日志信息:

  • git log -n:只显示最近提交的n条记录。
  • git log -n -p:显示最近提交的n条记录的详细信息。
  • git log --oneline:每次提交的信息都在一行之内显示(只显示少量信息)。

gitk:会打开一个新的GUI窗口,以图形化的形式展示所有的提交信息。

.gitignore:如果想要忽略某些文件,则可以在git库的根目录下创建一个.gitignore文件,然后将想要忽略的文件或者文件规则写入这个文件中,在git status时就不会显示忽略的内容了,并且git也不会将这些内容纳入版本管理的范围。常用的规则如下:

  • 文件:直接写入文件的路径,如a.txt
  • 目录:添加对应目录路径,如test/
  • 同一后缀名的文件:使用星号匹配,如*.pyo

HEAD:这是一个标签,指向当前正在使用的分支。

原文地址:https://www.cnblogs.com/guyuyun/p/12081762.html