GIT学习笔记目录
- 一. GIT安装和配置
- 1. 本体和插件下载
- 2. 配置
- 二. 新建仓库
- 1. 本地新建仓库
- 2. Clone远端仓库
- 三. 工作区域和文件状态
- 1. 工作区域介绍
- 2. 文件状态介绍
- 3. Clone远端仓库
- 四. 添加和提交文件
- 五. 回退版本
- 六. 查看差异
- 七. 删除文件
- 八. 忽略文件
- 九. 远程仓库配置
- 十. 本地仓库和远程仓库交互
- 1. 本地仓库上传 push
- 2. 远端仓库下载 pull
- 十一. 分支基本操作
- 1. 创建、切换和删除分支
- 2. 合并分支
- 3. 解决冲突
- 十二. 变基Rebase(慎用,逻辑比较复杂)
- 十三. 在一个分支上合并多次提交
- 十四. 一些好用的图形化Git软件可以简化命令行操作
- 十五. 补充(更新中)一些常用cmd命令
一. GIT安装和配置
1. 本体和插件下载
官网: GIT Download下载 安装过程中一路默认即可。
终端输入
git -v
查看git安装是否成功。
(可选)然后下载一个Git
状态显示到powershell
中的非常好用插件,posh-Git(windows):
用管理员身份打开powershell
,之后输入
Set-ExecutionPolicy RemoteSigned #一路 YesInstall-Module -Name posh-git -Scope CurrentUser
重启powershell
Import-Module posh-git
初始化仓库的文件位置会加一个GIT位置就对了。
注意要初始化仓库之后才有这个main
标志。
想要每次重启都不用再输入
Import-Module posh-git
就如下添加一个powershell
配置文件,我们一般开shell
输入的都是临时变量,不会保存,这个文件的作用是每次打开shell
都会执行一遍其中代码。
$profile # 显示 Windows PowerShell 配置文件的路径test-path $profile # 确定是否已经在系统上创建了 Windows PowerShell 配置文件,如果存在配置文件,则响应为 True:否则响应为 False。new-item -path $profile -itemtype file -force # 创建 Windows PowerShell 配置文件
之后按照路径打开该文件,把代码添加进去。
Import-Module posh-git
其中:
[master +1 ~0 -0 !]这是Git的分支状态指示符,提供了关于当前Git仓库状态的一些信息:master:这是当前所在的分支。+1:表示有一个文件被添加到了暂存区。~0:表示没有文件被修改但未暂存。-0:表示没有文件被删除但未暂存。!:表示有文件被修改但未追踪。
2. 配置
# 配置用户名和邮箱git config --global user.name "Winston" git config --global user.email "你的邮箱"
二. 新建仓库
1. 本地新建仓库
# cd到需要创建仓库的位置git initls -h # 应该有一个隐藏的.git文件夹mac命令,windows手动删吧:/rm -rf .git # 删除仓库 注意.git就是仓库的主要文件,删除就相当于删除仓库配置git init my_repo # 在该文件夹下创建一个新文件夹,并初始化它成为仓库
2. Clone远端仓库
# cd到需要创建仓库的位置git clone 仓库网址ls -h # 应该有一个隐藏的.git文件夹
三. 工作区域和文件状态
1. 工作区域介绍
工作区 暂存区 本地仓库 远端仓库
- 工作区->暂存区
git add
- 暂存区->本地仓库
git commit
- 本地仓库->远端仓库
git push
2. 文件状态介绍
3. Clone远端仓库
# cd到需要创建仓库的位置git clone 仓库网址
四. 添加和提交文件
# 查看仓库处在哪个分支,仓库下有那些文件,和文件的状态git status # 其中 UIntracked file就是未被跟踪的文件,显示为红色git add . # 把当前文件夹下的所有文件都加入到暂存区,等待后续操作。这里的.表示当前目录。git add *.txt # 把所有txt文件都加入到暂存区git add file.txt # 加入之后会有提示说Changes to be committed指的是有暂存区的文件没有提交到本地仓库,处于已修改状态。git rm --cached file.txt # 把文件从暂存区中移除git commit -m '提交信息' # 把暂存区的文件提交到本地仓库git commit -a -m "提交信息" # 一行命令执行添加暂存和提交, 只对已经添加过的文件生效,新文件不能用这个命令git log # 查看提交记录和提交信息git log --oneline # 查看简洁提交记录
五. 回退版本
git reset --soft 版本号 # 回退到某一个版本,并且保留工作区和暂存区的所有修改内容git reset --hard 版本号 # 回退到某一个版本,并且丢弃工作区和暂存区的所有修改内容git reset --mixed 版本号 # 回退到某一个版本,只保留工作区修改内容,丢弃暂存区的修改内容 default 参数
# 回退实例git reset --soft 5af90b8 # 软回退到5af90b8版本git reset --hard HEAD^ # 硬回退到上一版本
soft
参数回退之后,HEAD
指针指向回退的版本,提交历史变少,工作区和暂存区内容都多于本地仓库,相当于只是把commit
操作撤回了。并且
git reset --soft HEAD^git status # 提示有需要提交的文件ls # 文件与回退之前一致git ls-files # 查看暂存区文件,与回退之前一致
hard
参数回退之后,HEAD
指针指向回退的版本,提交历史变少,工作区和暂存区内容都等于本地仓库,相当于立刻回到之前的状态,完全扔掉两次提交之间的任何修改。并且
git reset --soft HEAD^git status # 没有工作要做ls # 文件比回退之前少了,与回退到的那个版本当时一样多git ls-files # 查看暂存区文件,文件比回退之前少了,与回退到的那个版本当时一样多
mix
参数回退之后,HEAD
指针指向回退的版本,提交历史变少,工作区内容多于本地仓库而暂存区一样多,相当于只把两次之间的差异保留在了工作区。并且
git status # 提示有未跟踪的文件ls # 文件与回退之前一致git ls-files # 查看暂存区文件,文件比回退之前少了,与回退到的那个版本当时一样多
这里mixed
和soft
有一个用法就是,多次提交想合并的时候,回退到想要保留为上一个版本的那一版,然后重新提交,这样即保留了所有修改,又能合并修改。
另外hard
参数回退会删除所有相关修改,谨慎使用,但其实我们仍然可以恢复这些修改,只能说GIT牛逼。毕竟文件应该没有多大,修改也不会幅度太大,因此存储的占用应该保留上一个版本都不是问题。
使用:
git reflog # 查看操作的历史记录,查看想要回溯的GIT版本git reset --n hard 想要回溯的GIT版本 # 回到想要回溯的GIT版本
六. 查看差异
通过 git diff
查看工作区,暂存区,本地仓库之间差异。还可以查看文件在两个特定版本之间的差异。或者文件在两个分支之间的差异。
git diff # 默认比较工作区和暂存区之间的差异内容 红色的文字是删除的内容,绿色是新加的内容git diff HEAD # 比较工作区和版本库之间的差异内容git diff --cached # 比较暂存区和版本库之间的差异内容git diff 第一个版本id 第二个版本id # 比较两个版本之间的差异内容git diff 5aF90qb HEAD # 比较5aF90qb版本和现版本的差异git diff 5aF90qb HEAD file.txt # 只查看这个文件的差异内容git diff 分支1 分支2 # 查看两个分支的差异
可以用HEAD
表示当前版本,HEAD~ / HEAD^
表示上一个版本, HEAD~3
表示往前数三个版本。
HEAD和ID的前后顺序不同,最后产生的结果就不同,我习惯后面写靠后的版本。
七. 删除文件
方法一:
rm file.txt # 也可以手动删除本地文件git status # 提示我们 deletedgit add . # 删除文件也是通过add进行的,这里也可以用file.txt代替.git commit -m "提交信息"
这个方法会麻烦一些,git
提供了另一种方法。
方法二:
git rm file.txt # 同时在工作区和暂存区删除该文件git commit -m "提交信息"
若想只删除暂存区文件,保留本地文件,加--cached
参数
git rm --cached file.txt # 若想只删除暂存区文件,保留本地文件,加--cached参数
八. 忽略文件
通过.gitignore
文件忽略文件,直接在文件里写文件名。
忽略文件的类型:
- 系统或软件自动生成的文件
- 中间文件(由另一个文件生成的文件)
- 日志文件,缓存文件,临时文件等
- 敏感信息文件
可以用通配符忽略所有的log文件:*.log
可以忽略文件夹:temp/
.gitignore
文件生效的前提是忽略的这个文件不能是已经被添加到版本库中的文件
九. 远程仓库配置
- 使用
GitHub
管理代码,在GitHub
官网注册并登录账号。+号创建仓库。 - 配置SSH秘钥:
参考windows秘钥配置,打开Git Bash
# 默认在根目录下ssh-keygen -t rsa -b 4096 # 之后一直回车一路到底。
找到目录C:/Users/Winston/.ssh
(用自己的用户名替换Winston)中的私钥(id_rsa
)和公钥(id_rsa.pub
)文件。
在GitHub
中点击头像
->Settings
->SSH and GPG keys
->New SSH key
把id_rsa.pub
中的公钥复制到Key
中,新建Key
如果成功应该在如下Git Bash
中输入ssh -T git@github.com
后输出successfully
这里的ssh应该是一个私钥加密公钥解密的过程,目的是确定操作者是你。
而公钥加密私钥解密的过程是为了不让别人看到。
十. 本地仓库和远程仓库交互
1. 本地仓库上传 push
git remote add 仓库名 仓库地址 # 将本地仓库连接到远程仓库git remote -v # 查看本地仓库对应的远程仓库别名和地址git branch -M main # 指定分支名称为maingit push -u origin main:main # -u表示初始化push,将本地的main分支和远程origin仓库main分支进行关联,如果两者分支名相同,写一个就行git push origin main:main # 将本地的main分支和远程origin仓库main分支进行关联,如果两者分支名相同,写一个就行
-u
这个标志设置跟踪信息。使用-u
,git
会记住远程仓库和分支的信息,这样以后你就可以简单地运行git push
而不必指定分支和远程仓库。
git push # 将本地的main分支推送到远程origin仓库main分支git push origin main:main # 当然你也可以写全,这一行与上一行是一个意思,因为初始化时已经进行了指定分支和仓库
2. 远端仓库下载 pull
# 如果不写默认仓库名和分支名,默认拉取的是origin仓库的main分支git pull origin main:main # 将本地的main分支和远程仓库main分支进行关联,如果两者分支名相同,写一个就行
需要注意git
会对pull
下来的远程仓库文件和本地文件进行合并,如果有冲突就不会合并,会要求解决冲突。
git fetch # 另一种拉取方式,但是不会合并,需要我们手动合并。
十一. 分支基本操作
1. 创建、切换和删除分支
git branch # 查看仓库中的所有分支git branch winston # 创建新的分支git switch winston # 切换到新的分支git branch -d winston # 删除分支git checkout -b winston 想要恢复的winston分支提交ID # 恢复分支git log --oneline --graph --decorate --all # 查看提交ID
2. 合并分支
当前所在分支是合并之后的目标分支,命令之后的分支是需要合并到当前分支的分支。
git switch main # 切换到目标分支git merge winston # 将winston分支合并到main分支git log --graph --oneline --decorate --all # 查看分支图,在图形化界面上显示更为美观
分支合并之后还是存在的,如在main
中合并winston
,winston
仍存在,内容和合并前一致,如果不需要可以手工删除。
git branch -d winston # 删除这个分支,-d表示这个分支已经完成了合并,没有被合并的话就会被拒绝git branch -D winston # 强制删除这个分支,即使未合并
合并分支后日志里的显示是两个分支的所有日志按照时间顺序排序生成的新日志。
3. 解决冲突
如果两个版本改变了同一个文件的同一行代码,就需要解决冲突。(实测如果winston
在第3行末尾追加了代码,main
添加了一行代码作为第4行,合并时也会出现冲突)
git switch main # 切换到目标分支git merge winston # 将winston分支合并到main分支
git
报错说有冲突。
git status # 冲突文件列表git diff # 冲突的具体内容
- 如果想要解决冲突并继续合并就:
文件中等号上面部分是main
分支的修改内容,下面是winston
分支的修改内容。接下来我们编辑这个加入了等号和箭头的文件。
vi file.txt
git add .git commit -m "merge conflict"
- 如果想要终止合并就:
git merge --abort
十二. 变基Rebase(慎用,逻辑比较复杂)
rebase
命令和merge
有一定相似度,merge
是合并两个分支,rebase
是变基如下图:
- merge
- rebase变基最终结果都是一条直线,有如下两种情况(顺序不同):
git switch devgit rebase main # 将dev分支以main分支为基
变基前 | 变基后 |
---|---|
git switch maingit rebase dev # 将main分支以dev分支为基
变基前 | 变基后 |
---|---|
最主要的区别有两点:
rebase
变基不像merge
按照时间顺序对多次提交进行合并,而是直接把一条分支的提交记录嫁接到另一条分支上。rebase
不会产生额外的提交记录,形成线性历史;而merge
会产生一个合并的提交记录,分支图复杂。
十三. 在一个分支上合并多次提交
这里我们在分支r上进行了三次提交
需要将三次提交的文件内容保留,而提交记录合并,并且把提交信息整合成一个,用如下三个命令是等价的:
git rebase -i 6b837bd8e38c02e60f5bc2838c6dd5a82e73364f # -i后面跟的是不需要合并的版本号git rebase -i HEAD~3 # 合并近三次提交(包括HEAD指向的最近提交)git rebase -i HEAD^^^ # 合并近三次提交(包括HEAD指向的最近提交)
之后单击i
按键,进入编辑模式,注意到有一行注释写的是s, squash <commit> = use commit, but meld into previous commit
,意思是保留那一次提交,但是融入到之前的提交中,因此我们只保留第一个pick
,后面的都改写成s
。
然后我们ESC
退出编辑模式,shift + :
输入wq
回车保存并退出,就会出现如下界面:
我们随便选择一行作为最后提交信息的输出行,其余的都打上#
。
Successfully rebased and updated refs/heads/r.
最后用git push -f
命令强制推送到远端就可以了。
git push -f
十四. 一些好用的图形化Git软件可以简化命令行操作
VS code
中就有源代码管理器,可以为我们提供快速的文件添加,提交,上传的图形化按钮。- 想要实时观察
git
工作树,可以在VS code
中下载插件Gitlens
,提供了很多git
有关功能。
十五. 补充(更新中)一些常用cmd命令
- win11命令行
mv file.txt file1.txt # 文件改名del 文件名 # 删除文件rmdir 文件夹名 # 删除空文件夹rm -r # 删除非空文件夹alias graph="git log --graph --oneline --decorate --all" # 将命令写成别名graph,建议写在git配置文件中
全文参考:一小时GIT教程