虽然一直在用git,但是自从开始用JetBrains家的IDE以后就没碰过命令行版本的git了(图形化界面害人不浅)
基础知识
The woking directory:与本地文件系统同步
Staging index:即被git add
加入的暂存区
Commit history:git commit
后加入的版本库
HEAD指针:在Commit history中指向当前工作位置
具体命令
branch
git branch
列出所有分支,git branch <branch>
基于HEAD新建分支,-d
用于删除已合并的分支,-D
强制删除分支,m
重命名分支。
status
status 显示的是目前需要add(图中为红色)和需要commit(绿色)的文件,这一命令同时给出文件目前的状态
log
log 显示当前分支的版本历史,--branches=*
查看所有分支的历史。可以增加各种选项。--oneline
显示简介版本,--graph
绘制拓扑图更直观显示版本变化,-n
限制显示个数,--author
等可以查询特定限制的修改。
checkout
1.切换分支
2.使用git checkout -b <new-branch><existing-branch>
可以基于已有分支新建并切换到新分支,<existing-branch>
默认为当前HEAD。
3.切换到某次commit的状态,可以查看旧版本的代码。但此时处于"detached HEAD"状态,此时所进行的修改与整个开发工作完全分离。可以通过 git switch -c <new-branch-name>
建立新branch来保存修改,或是直接git switch -
来撤销修改(好像也可以用git checkout -b
?不知道有啥区别)。
具体实现过程是用commit history中的文件更新staging index,再更新woking directory。因此可以使用git checkout .
来放弃未add的更改。
revert
通过一个新的提交来消除某次提交产生的影响,原有的提交会保留。
使用git revert HEAD
后
reset
将HEAD指针和branch的指针指向指定的commit。--soft
到此为止,--mixed
还会修改Staging index,即当前的文件修改不会丢失,--hard
额外再修改woking directory。默认为--mixed
。(所以--soft
是处理啥需求的啊
reset相当于丢弃了所选commit之后的commit,因此只能在push之前执行。
可以利用git reset <file>
来将特定文件移出Staging index,或直接使用git reset
重置Staging index。
rm
--cached主要用于删除Staging index中的文件,默认则会同时删除Staging index和woking directory下的文件。如果Staging index或woking directory中要删除的文件与HEAD中的文件不同,则需要使用-f。同样地,-r用于删除目录。
remote
管理本地储存的远程库条目。-v
显示所有远程库,add
、rm
、rename
增、删、改远程库条目
fetch
下载远程分支并储存在本地的远程库副本中,并不改变本地工作目录的内容。这种操作比较灵活安全,可以通过checkout
切换到远程分支上进行操作并通过 git switch -c <new-branch-name>
将远程库保存到新分支上。pull
相当于fetch
后直接merge
,在本地库建立新提交。pull --rebase
相当于fetch
后rebase
,在本地库重现远程提交来保证线性历史。可以用git config --global branch.autosetuprebase always
来默认使用rebase
。
rebase
将整个分支移动到另一个分支,通过将原始分支中的每个提交创建新的提交来实现(如下图),可以保证提交历史的简洁性和线性。-i
可以让分支的历史记录更加符合需求。
merge
建立一个全新的提交来合并两个分支,不会改变已有的提交历史,但是会引入一个新的提交,污染了历史记录。
git push --force
强制更改远程分支使其与本地分支同步,只有当没有其他人在使用这一远程分支时才可以考虑使用,可以有效清除黑历史