Head First Git笔记

第4章

  git restore 文件名:当还没有提交到Index时,撤销当前做的修改,working directory, index, object database当前一样;想象与git add相反

  git restore --staged 文件名:当把修改提交到Index后,撤销所做的修改,index, object database一样,working directory不一样;想象与git commit相反

  git rm 文件名:将文件从index和working directory中移除掉,注意,如果是untracked的文件,可以不通过git命令删除,直接用linux的rm命令删除即可;如果对tracked的文件用linux的rm删除,则会有点问题,可以执行git add -u 文件名来更新一下index,因为你刚刚直接删除文件后index中的没有删除,所以要更新一下。也就是说,git rm只用于tracked的文件。

  git mv 文件名a 文件名b:将文件从文件名a改为文件名b,也只用于tracked的文件。

  git commit --amend -m "新的注释说明":修改所在分支的最后一次提交的信息,注意点:只能修改最后一次提交的;只能当index没有东西的时候执行,不然会把你在index暂存的一起给提交了,因为这个命令的原理是把object database中的内容复制到index,然后再做一次提交,覆盖掉上一次的提交,与上一次提交的元数据里面就只有注释信息的差异,时间、提交人这些都不会改变。

  git branch -m(--move) 新的分支名:将当前的分支名改为新的分支名;git branch -m 老的分支名 新的分支名:不管你现在在哪个分支,将老的分支名修改为新的分支名

  head:代表当前分支的最后一次的提交。head~1代表父亲提交节点,head~2代表父亲的父亲提交节点,以此类推。head~1与head~等价。如果当前处在合并分支的节点,则它会有两个父亲节点,则head^1代表第一个父亲,即proposer,head^2代表第二个父亲,即proposee。有了这个便利的写法,就可以用在git switch, git diff, git reset等上面。

  git reset 之前的某一提交节点:撤销改变到之前的某一个节点,这个节点可以任意。常用的有3个flag,--soft:object database变为你的参数节点的内容,working directory和index变为当前节点的内容,你还有反悔的机会(再提交就相当于反悔了);--mixed(这是默认选项):object database和index变为你的参数节点的内容,working directory变为当前节点的内容,你也还有反悔的机会(add一次,提交一次就相当于反悔了);--hard:直接回到你的参数节点的内容,三个区域的内容都为你的参数节点的内容,这次就没有反悔的机会了。

  git revert head:用于退回到上一次提交的状态。这个命令本质上又多出了一条提交记录,只是回到了上一次提交的状态,跟git reset区别还是挺大的,这个命令不会擦除历史提交,而git reset会。

 

第5章

  git clone url用于拉取远程仓库,文件名为远程仓库的文件名,如果要修改名字,则在url后面加个自己想要的名字即可,但一般不这样做

  git init创建的仓库和git clone拉下来的远程仓库没有区别

  本地的仓库叫做clone,远程的仓库叫做remote

  用git config --global push.default simple做个全局设置,我也解释不清为什么

  git push用户提交本地的改变到远程仓库,如果用户没有修改远程仓库的名称,则默认为origin,git push = git push origin

  git remote可以查看远程仓库的名称,git remote -v(--verbose) 可以查看更多信息

  两种方式推送代码,

    1)在本地新建分支,修改代码,合并分支,然后提交master;

    2)在本地新建分支,用git push -u(--set-upstream) origin 本地分支名 提交分支到远程,远程会多出分支来

  在远程可以创建pull request来合并分支,合并之后照样应该删除分支

 

第6章

  git pull用于将远程分支发生的最新提交拉到本地,从而更新本地分支,用于更新当前所在的分支

  远程跟踪分支(remote tracking branch)用于本地和远程分支的桥梁,由Git管理,使用git branch -a(--all) 可以查看所有分支

  git branch -v可以列出本地的分支和每条分支最后一次提交信息;-vv可以列出-v的所有东西,同时还包括远程跟踪分支;-a可以列出所有本地分支和远程跟踪分支;这些flag可以混用

  git pull相当于git fetch + git merge,git fetch用于更新本地所有的远程跟踪分支,然后git merge将远程分支合并到当前所在分支

  一般推荐不用git pull,而是先git fetch,再git merge,如果对git认识很熟就用git pull;一般用git fetch -p(--prune),这样可以更新远程跟踪分支同时可以删除本地多余的远程跟踪分支

  如果在github上合并了pull request后,没有删除分支,也可以在本地执行命令删除:git push -d origin 分支名称

   下面是推荐的Git使用流程方式:

 

 

第7章

  git blame 文件名:可以用于查看文件的每一行的修改记录,包括修改者、修改时间、修改时的提交ID信息以及该行的内容。github网页版也有这个功能(in a slightly more "human" format)。blame后面可以先跟提交节点的ID,然后再跟文件名,表示查看该节点时该文件的修改信息,默认则是HEAD,即git blame drinks.md === git blame HEAD drinks.md

  git grep 字符串:可以用于搜索指定的字符串,搜索范围不包括.gitignore排除的文件。该命令有常用的一些flag,-i(-- ignore-case)表示忽略大小写,-n(--line-number)表示显示行号,-l(--name-only)表示只显示文件名。可以以正则表达式来搜索

  git log -S "字符串":可以搜索字符串在哪些提交里面被新增或删除,git log -G "字符串":可以搜索字符串在哪些提交里面包含该字符串的行被改变,加上-p(--patch)可以查看差异的细节内容,加上--word-diff可以以更简洁的方式查看。git log --grep "字符串":可以从每次的提交信息里搜索包含该字符串的提交。

  git checkout ID:可以查看在该提交id时,工作目录的文件状态内容。此时HEAD的状态为detached HEAD state,可以在当前节点修改文件,如果switch回到原来的分支,则抛弃了修改;也可以用git checkout -c 分支名来创建分支,跟正常操作一样。

  git bisect可以用于查找bug从何而来(从哪个提交而来),用的是二分法查找,具体用法如下:

git bisect start    //    开启会话
git bisect bad HEAD    //    HEAD表示当前就有bug,也可以自己设一个有bug时的提交ID
git bisect good ID    //    设置没有bug那一次的提交ID
git bisect bad/good    //    自己查看文件告诉git当前是否含有bug,如果为good则就找到了bug开始出现的地方
git bisect reset    //    结束会话

 

第8章

  git config --global section.key value:可以用于git的全局配置,user.name配置提交时的用户名,user.mail配置提交时的邮箱,全局配置的文件存放在用户的目录下,文件名为.gitconfig;git config --local section.key value配置局部,只用于当前所在的仓库。配全局时可以在任意的目录下做配置,但配局部时只能在当前仓库的根目录配置。git config --local --unset user.email可以移除某个配置,对于移除全局配置则用global即可

  git config --list:可以查看所有的配置;git config --list --show-origin:可以查看所有配置,包括配置文件的路径

  git config --global alias.loga "log --oneline --graph --all",用alias可以配置别名,在命令很长的情况下很好用,一般配别名都配成全局的,不会针对某个仓库单独配置别名。

  .gitignore文件可以配置需要忽略的文件

  编写提交信息时,很有讲究,可以参考https://www.conventionalcommits.org/zh-hans/v1.0.0/

  给分支命名时,也有点讲究,一般为:用户名/ticket number/分支的目的;用户名可以用个简称,表示谁在负责这条分支,ticket number有就写,没有就不写,分支的目的每个单词以中横线连接,如:rg/1618/remove-typos-in-documentation

 

Appendix

  git tag v1.0.0:可以用于进行类似打包的动作,可以加上提交的ID,表示在该处打包,不加则默认HEAD。使用git tag -l(--list)可以查看所有的打包记录;

  git cherry-pick ID:可以将其他某个分支的提交节点合并到当前分支;

  git stash:当需要switch到其他分支时如果报错,可以把当前working directory和index中的内容暂存到某个地方,切换回来后再使用git stash pop --index即可还原;

  git reflog:可以查看HEAD的每一次移动日志,切换分支会改变HEAD,会有日志,只要移动了HEAD就产生日志;

  git rebase master:另一种合并分支的操作方式。

  

  

 

 

  

 

 

 

 

 

 

 

  

  

posted @ 2022-12-18 14:28  不夹心饼干  阅读(115)  评论(0编辑  收藏  举报