参考廖雪峰老师的教程记录一下学习Git的过程
Git的常见命令和基本用法
初始化Git仓库
初始化一个新的 Git 仓库:
1 | git init |
克隆远程仓库
从远程仓库克隆代码:
1 | git clone <repository-url> |
查看状态
查看当前文件的状态(已修改、未追踪等):
1 | git status |
添加文件到暂存区
将更改的文件添加到暂存区:
1 | git add <file> |
提交更改
提交暂存区的更改:
1 | git commit -m "Your commit message" |
查看提交历史
查看提交历史:
1 | git log |
分支操作
创建新分支:
1
git branch <branch-name>
切换到指定分支:
1
git checkout <branch-name>
或者使用
git switch
1
git switch <branch-name>
创建并切换到新分支:
1
git checkout -b <branch-name>
删除本地分支:
1
git branch -d <branch-name>
查看当前所有分支:
1
git branch
合并分支
将一个分支合并到当前分支:
1
git merge <branch-name>
将当前分支的提交变基到
master
分支 假设你当前处于feature
分支,并且希望将它的修改“变基”到master
分支的最新提交上:1
2git checkout feature # 切换到要变基的分支
git rebase master # 将当前分支变基到 master 上将分支变基到最新的远程分支 假设你有一个本地分支
feature
,而远程仓库的master
分支有了新的提交,你想要将feature
分支的提交放到远程master
上的最新提交之后:1
2
3git fetch origin # 拉取远程仓库的更新
git checkout feature # 切换到需要变基的分支
git rebase origin/master # 将本地 feature 分支变基到远程 master
常见的 rebase
选项
**
--continue
**:如果在变基过程中发生冲突,解决冲突后,继续变基:1
git rebase --continue
**
--abort
**:如果在变基过程中不想继续,可以中止变基操作,恢复到变基之前的状态:1
git rebase --abort
**
--skip
**:如果你希望跳过当前有冲突的提交,直接跳到下一个提交:1
git rebase --skip
merge
会保留所有的提交历史,并生成一个新的合并提交。这对于展示一个清晰的分支历史非常有用,尤其是当团队协作时。rebase
会重写历史,消除合并提交,使历史线性化。适用于个人开发过程中,或者在合并分支之前清理历史。
推送和拉取远程仓库
推送本地分支到远程仓库:
1
git push origin <branch-name>
从远程仓库拉取最新更改:
1
git pull origin <branch-name>
查看差异
查看文件更改的差异:
1
git diff
恢复文件
恢复工作区的文件(撤销本地修改):
1
git checkout -- <file>
重置修改
重置本地分支到某个提交:
1
git reset --hard <commit-id>
删除远程分支
删除远程仓库中的分支:
1
git push origin --delete <branch-name>
查看远程仓库
查看当前 Git 仓库的远程地址:
1
git remote -v
配置 Git
配置用户名和邮箱:
1
2git config --global user.name "Your Name"
git config --global user.email "[email protected]"
实战应用记录
在Github
上新建的repository
需要使用git初始化,添加README.md
(可选)
1 | echo "# Test" >> README.md |
1 | git remote add origin https://github.com/xxxx/xxxx.git |
简单解释一下git commit
命令,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
我个人认为最核心的就是三个命令了,掌握这三个就足够了
1 | git init |
顺便再解释一下git fetch
和git pull
的区别
git fetch
git fetch
是从远程仓库获取最新的提交(包括新分支、标签等),但它不会自动合并这些变化到本地分支。
- 作用:更新本地仓库的远程跟踪分支(如
origin/master
),但是本地工作目录和当前分支不会发生任何变化。 - 何时使用:
- 当你想要查看远程仓库的最新状态,但不想立即合并这些更改到当前分支时。
- 当你想检查远程分支的变化,再决定是否要合并到本地分支。
1 | git fetch origin # 拉取远程仓库的所有变化,但不合并到当前分支 |
拉取完成后,你可以查看本地的远程跟踪分支(如 origin/master
):
1 | git log origin/master |
git pull
git pull
是 git fetch
和 git merge
的结合体。它首先会执行 git fetch
拉取远程更新,然后自动将远程仓库的变化合并到当前分支。
- 作用:从远程仓库获取最新变化,并自动合并到当前工作分支。
- 何时使用:
- 当你希望快速将远程分支的变化合并到当前分支时,
git pull
会一站式完成拉取和合并。 - 在和团队合作时,尤其是在多人协作的项目中,常常用来同步本地分支和远程分支。
- 当你希望快速将远程分支的变化合并到当前分支时,
1 | git pull origin master # 拉取远程 origin 仓库的 master 分支,并合并到当前分支 |
主要区别
功能/命令 | git fetch |
git pull |
---|---|---|
获取更新 | 拉取远程更新,但不合并。 | 拉取远程更新,并自动合并到当前分支。 |
合并行为 | 不会自动合并,只更新远程跟踪分支。 | 自动将远程更新合并到当前工作分支。 |
控制 | 需要手动合并远程变化(如使用 git merge 或 git rebase )。 |
自动合并,合并方式是默认的(通常是 merge )。 |
使用场景 | 用于检查远程更新,避免直接影响当前工作。 | 用于快速同步远程仓库的变化到本地分支。 |
如果你有一些文件是新添加的,但尚未执行 git add
,这些文件是 未跟踪的文件,可以使用以下命令来删除它们:
删除未跟踪的文件(即删除新创建的文件):
1
git clean -f
删除未跟踪的目录(如果有新创建的文件夹):
1
git clean -fd
注意:
git clean
会永久删除未跟踪的文件或目录,请谨慎使用。
删除文件
git rm
是 Git 中用于删除文件的命令,它既可以删除 已跟踪的文件(即已经被 Git 版本控制的文件),也可以用于从 Git 仓库中移除文件(但可选择保留工作区副本)。命令 作用 备注 git rm <file>
从 Git 仓库和工作区删除文件,添加到暂存区。 删除文件并提交删除操作。 git rm -f <file>
强制删除文件,删除只读文件或已修改的文件。 强制删除文件,通常用于冲突或只读文件。 git rm --cached <file>
从 Git 仓库移除文件,保留工作区的副本。 停止跟踪文件,文件仍在本地保留。再进行 git clean -f
删除工作区的文件git rm -r <dir>
删除目录及其中的所有文件。 用于删除目录及其内容。 git rm --dry-run <file>
模拟删除操作,不执行实际删除。 用来查看哪些文件会被删除。 git rm --ignore-unmatch <file>
忽略未跟踪的文件,避免报错。 跳过未跟踪文件,避免删除时的错误。 撤销对文件的修改
git restore
和 git checkout -- file
在某些情况下是等价的,但是更加建议使用git restore
对比总结:
功能 | git restore |
git checkout -- |
---|---|---|
用途 | 专门用于恢复文件到上次提交的状态或指定提交状态 | 用于恢复文件或目录到上次提交的状态 |
语法 | 更直观,git restore <file> |
使用 git checkout -- <file> (较为冗长) |
是否修改历史 | 不修改历史,只影响工作区和暂存区 | 只影响工作区,不修改 Git 历史 |
恢复工作区文件 | git restore <file> 或 git restore . |
git checkout -- <file> 或 git checkout -- . |
恢复暂存区文件 | git restore --staged <file> |
无直接等价命令,git reset 用来撤销 git add |
支持更清晰的语义 | 是的 | git checkout 是多用途命令,语义不如 git restore 清晰 |
git reset
和 git restore --staged
在许多情况下是等价的,特别是当你想要撤销 git add
(即将文件从暂存区移除)时。它们的作用都是将文件从暂存区移除,但两者的语法和适用范围有所不同。
对比:git reset
vs git restore --staged
**
git reset
**(用于撤销git add
):- **
git reset <file>
**:将文件从暂存区移除,恢复到未暂存状态(即不再待提交)。 - 它会影响 暂存区,但 不会改变工作区的内容。文件在工作区的修改仍然保留。
- **
**
git restore --staged
**:git restore --staged <file>
:将文件从暂存区移除,恢复到未暂存状态,不改变工作区的内容。- 这是 Git 2.23 版本引入的新命令,设计上更加清晰和直观,专门用于恢复暂存区的文件。
如果你只需要撤销 git add
,git restore --staged
更推荐,因为它语法清晰、直观。如果你需要进行更多复杂的操作,git reset
是一个更灵活的选择。
其他更多命令
标签命令
命令 | 作用 | 备注 |
---|---|---|
git tag |
查看所有标签 | 列出所有标签。 |
git tag <tag> |
创建一个标签 | 创建一个标签,指向当前提交。 |
git tag -a <tag> |
创建一个带注释的标签 | 创建带有注释的标签。 |
git push <remote> <tag> |
推送标签到远程仓库 | 将本地标签推送到远程仓库。 |
其他常用命令
命令 | 作用 | 备注 |
---|---|---|
git stash |
将当前工作区的修改保存到栈中,恢复干净工作区 | 临时保存当前的工作进度,稍后恢复。 |
git stash pop |
恢复栈中的修改,并从栈中删除 | 恢复最后一次保存的工作进度。 |
git stash list |
查看当前栈中的所有修改 | 列出所有保存的工作进度。 |
git bisect |
使用二分法查找引入 bug 的提交 | 用于调试和定位特定提交引入的 bug。 |