Git 使用笔记
概念理解
未索引文件 / Untracked Files:
未索引文件,指一个文件从未接受过任何git操作
[VS Code]这类文件在VS Code的git面板里,其前会有一个U字母图标工作区 / Working Directory:
添加文件、修改文件、删除文件等等操作,都发生在工作区里
[VS Code]当你修改了任何文件,这些文件就会出现在VS Code中的git面板里的更改区域下,这个更改区域就是工作区暂存区 / Staged Changes
工作区里的文件,可以通过git add
命令来添加到暂存区里,以便进行下一步的git commit
操作
[VS Code]对更改区域的文件点击加号,这个文件就会被移动到暂存的更改区域下,这个区域就是暂存区区别工作区和暂存区
一个文件可以在git add
操作后,又再次进行修改,这时候它会同时出现在工作区和暂存区里,工作区里保存的是git add以后所进行的那些修改
当你对这个文件进行git commit
的操作时,工作区里的修改不会被提交,只有暂存区里的所保存的那些修改内容才会被提交版本库
一个文件的修改一旦提交后,就会从暂存区里消失,转而保存在git的版本库里。可以通过git log
命令来查看版本库(每一次的提交历史)
可以通过各类操作,把一个文件恢复到版本库里记录的某个状态(即恢复到某一次提交时那个文件当时所保存的内容)
而工作区和暂存区的内容,一旦没有最终提交,而是被撤销了,是找不回来的远端 / Remote
前面的概念都是在一个本地的git仓库里发生的
可以通过git remote add
命令把一个本地仓库和一个远端仓库(即服务器)联系起来,之后便可以通过git push
、git pull
等命令来进行本地和远端之间的操作HEAD
HEAD指的是版本库里,最后的一次提交。
常用命令
配置
- 添加用户名:
git config --global user.name <用户名>
- 设置用户邮箱:
git config --global user.email <邮箱>
必须设置用户名和邮箱后,才可以git push
等进行远端操作
杂项
- 查看当前仓库状态:
git status
- 查看版本库记录:
git log
,每条提交记录会有一个hash值
暂存操作
- 添加文件到暂存区:
git add <文件或文件夹路径>
(相当于VS Code里点击加号)
如果执行git add .
,则会递归地把当前目录下的所有文件添加到暂存区
提交操作
- 提交修改:
git commit -m <提交信息>
这个操作会把暂存区里的所有修改一次性提交,但不会影响到工作区 - 修改最后一次提交:
git commit --amend -m <提交信息>
,这回修改最后一次提交的提交信息
如果执行这个命令式,暂存区里有内容,则会把当前暂存区的内容也一起合并提交进去 - 撤销提交:
git revert <commit hash>
,hash值可以通过git log
命令查看,是一个字符串
这会把这一次commit之后的所有commit从版本库里撤销,commit的内容回到暂存区
比较操作
- 查看工作区所做的修改:
git diff
- 查看暂存区和最后一次提交的差异:
git diff --cached
- 对比两次提交的差异:
git diff <commit a hash>..<commit b hash>
以上三个命令,后接<文件路径>,可比较单个文件
撤销操作
撤销暂存区的所有文件到工作区:
git reset HEAD
撤销单个文件/文件夹:
git reset HEAD <文件/文件夹路径>
把最后一次提交后所做的任何更改:
git reset --hard HEAD
详见git reset
命令撤销单个文件:
git checkout -- <文件路径>
撤销某个提交后的所有提交:
git reset <模式> <commit hash>
这个命令适用于提交还没有发布到远端的情况用某个提交重新覆盖它之后的所有提交:
git revert <commit hash>
这个命令适用于提交已经发布到远端的情况,它的效果与reset的相似,但不是直接撤销,而是通过重新提交某个旧提交来覆盖它之后所做的修改
reset
接受-soft
、--mixed
、--hard
三种参数,默认是--mixed
-
--soft
:只撤销提交,所撤销的内容内容出现在暂存区 -
--mixed
:撤销提交和暂存,所撤销的内容出现在工作区 -
--hard
:完全撤销,包括工作区,但不包括未索引文件(新建立的文件)
分支操作
- 查看本地分支:
git branch
- 查看远端分支:
git branch -r
- 查看所有分支:
git branch -a
- 重命名当前分支:
git branch -m <分支名>
- 合并分支:
git merge <分支名>
,把某个分支的内容合并到当前分支 - 重设分支的根基:
git rebase <分支名>
,把当前分支的所有提交暂存到某个地方,再把<分支名>所指的分支合并过来,然后再重新把那些暂存的提交应用上去。
重新应用提交的过程中,如果有冲突,解决冲突后执行git rebase --continue
过程如果出现错误,想退出rebase,执行git rebase --abort
结果中标星号的分支表示当前所处的分支
- 切换分支:
git checkout <分支名>
- 新建分支:
git branch <分支名>
,分支将会在当前分支的状态下建立 - 新建并切换到该分支:
git checkout -b <分支名>
,分支将会在当前分支的状态下建立 - 删除分支:
git branch -d <分知名>
,把参数改成-D
可以强制删除正常情下不允许删除的分支 - 根据某个远端分支新建本地分支:
git checkout -b <本地分支名> -t <远端分支名>
- 设置本地分支的上游分支:
git branch -u <主机名>/<远端分支名> <本地分支名>
或git branch --set-upstream-to=<主机名>/<远端分支名> <本地分支名>
- 设置当前分支的上游分支:
git branch -u <主机名>/<远端分支名>
存储操作
存储修改:
git stash
,会把当前分支下的工作区和暂存区的内容存储到一个临时的地方
可以通过git stash save <备注>
来为本次存储添加备注内容
注意,未索引文件不会被存储,必须先对其进行git add
操作查看所有存储:
git stash list
提取某次存储的内容到当前分支:
git stash apply stash@{<序列号>}
,提取后,该条存储依然存在提取某次存储的内容到当前分支并删除该条存储:
git stash pop stash@{<序列号>}
,提取后,该条存储会被删除,无法再找回删除某次存储:
git stash drop stash@{<序列号>}
以上条命令若不含stash@{<序列号>}
,默认会对最后的一次存储进行操作
远端操作
克隆远端仓库:
git clone <远端仓库地址> <本地目录名>
连接远端仓库:
git add remote <主机名> <远端仓库地址>
,一般把远端版本库命名为origin修改主机名:
git remote rename <原主机名> <新主机名>
修改远端仓库地址:
git remote set-url <主机名> <远端仓库地址>
断开远端仓库:
git remote rm <主机名>
显示远端仓库信息:
git remote show <主机名>
获取远端的最新分支列表:
git remote update <远端版本库命名>
拉取远端分支到本地:
git fetch <主机名> <远端分支名>
推送本地分支到远端:
git push <主机名> <本地分支名>:<远端分支名>
拉取远端分支并合并到本地分支:
git pull <主机名> <本地分支名>:<远端分支名>
以上两个命令,若本地分支为当前分支,当前分支名可省略
若本地分支已经设置了上游分支,远端分支名也可以省略
若远端仓库只有一个,主机名也可以省略
- 删除远端分支:
git push <主机名> -d <远端分支名>
或git push <主机名> :<远端分支名>
- push的同时设置为上游分支:
git push -u <...>
- push本地仓库版本较旧的分支,强制覆盖掉远端仓库把本较新的分支:
git push --force/-f <...>
- pull的时候采用rebase方式而不是默认的merge方式:
git pull --rebase <...>