Git常用操作大全(基础到高级)

321 阅读6分钟

Part1:基础篇

1.安装与配置

git init 初始化本地仓库

替代命令:git clone xxx.com 

git config 配置

配置用户名:git config user.name "Tom"
配置邮箱地址:git config user.email "abc@koo.com"
参数:--global 全局配置用户名或邮箱地址,表示配置对所有仓库生效
查看所有配置:git config --list

git clone <url> 克隆项目

默认会克隆主分支,如果想克隆子分支可以使用下面的命令:

git clone -b child-branch <url>

2.基本工作流

git status 查看当前状态(哪些文件被修改、暂存、未跟踪)

参数:-s 以简洁模式展示  

git add 添加更改

git add . 会添加当前目录及所有子目录的更改(包括新添加的文件)
参数:-u 只添加已跟踪文件的修改(不包含新增的文件) 
参数:-A 添加所有文件的修改(包括删除的文件)

git commit -m "提交信息..."

注意:如果不加-m参数会进入到vim编辑器,vim里可以写多行提交信息  

⚠️注意:add和commit操作都是对本地的暂存区做操作

git log 查看操作历史

    参数:--oneline 查看简洁历史
    参数:--graph 查看分支合并情况
    参数:-p 显示每次提交的详细更改
    替代:git reflog(查看所有操作记录,包括被删除的提交)

3.查看对比与更改

git diff 查看工作区和暂存区的差异

参数 --staged 查看暂存区和最新提交的差异

git show <commit-id> 查看某次提交的具体内容更改

4.撤销与回退

git restore <file> 撤销工作区的更改,恢复到最近一次 git commit或 git add的状态

参数:--staged 将文件从暂存区撤出(取消暂存),但保留工作区的修改

git reset 回退到某个提交

参数:--soft 回退提交,但保留工作区和暂存区的内容
参数:--mixed 默认,并重置暂存区,但保留工作区内容
参数:--hard 彻底回退提交,丢弃工作区和暂存区的所有更改

Part2:进阶篇

1.分支管理

git branch 查看、创建、删除分支

用法:git branch <branch-name> 创建分支
参数:git branch -d <branch-name> 删除已合并的分支
参数:git branch -D <branch-name> 强制删除分支(不管它是否被合并)

git checkout <branch-name> 切换到指定分支

参数:-b 创建新分支并切换到新分支

git switch <branch-name> 切换到指定分支

参数:-c 创建新分支并切换到新分支

2.合并与解决冲突

git merge <branch>

1.快进合并
当目标分支是当前分支的直接上游时(即没有分叉),Git会执行快进合并
git checkout main
git merge feature-branch
特点:不会创建新的合并提交,只是移动分支指针
适用场景:当目标分支没有新的提交时
2.非快进合并
当两个分支都有新的提交时,Git会创建新的合并提交
git merge --no-ff feature-branch
特点:总是创建新的合并提交,即使可以快进
适用场景:保留完整的历史记录,明确显示合并点
3.三方合并
当两个分支都有修改且不是简单的快进情况时,Git会使用三方合并算法
git merge feature-branch
特点:Git会查找共同祖先作为合并基础
特点:自动尝试合并变更,如果有冲突会提示解决
常用选项:
1.git merge --no-ff feature-branch
参数:--no-ff
特点:强制创建合并提交,即使可以快进
2.git merge --ff-only feature-branch
参数:--ff-only
特点:仅允许快进合并,如果不能快进则中止
3.git merge --squash feature-branch,git commit -m "合并feature-branch的变更"
参数:--squash
特点:将多个提交压缩为一个变更集,但不自动提交
4.git merge --abort
参数:--abort
特点:在合并冲突时中止合并过程,恢复合并前状态
5.git merge --continue
参数:--continue
特点:解决冲突并标记为已解决后,继续合并
6.git merge -m "合并feature-branch的重要功能" feature-branch
参数:-m
特点:为合并提交指定消息
7.git merge --stat feature-branch
参数:-stat
特点:在合并结束时显示变更统计
8.git merge --no-commit feature-branch
参数:--no-commit
特点:执行合并但不自动提交
当两个分支修改了同一个文件的同一部分时,Git无法自动决定该保留哪个修改,就会产生冲突
🍺 解决冲突的步骤:
1.执行git merge命令发现问题
2.打开有冲突的文件,删除标记并保留正确的代码:
<<<<<<< HEAD 
当前分支的代码 
======= 
要合并分支的代码
>>>>>>> branch名
3.冲突解决后执行git add <file>
4.完成合并:git commit或git merge --continue,Git会自动为你生成一个合并提交的消息
5.如果要中止合并:git merge --abort
合并策略:
Git 提供了多种合并策略,可以使用-s选项指定
1.recursive(默认策略)
git merge -s recursive feature-branch
2.resolve(仅适用于两个分支的简单合并)
git merge -s resolve feature-branch
3.octopus(用于合并多个分支)
git merge -s octopus 分支1 分支2 分支3
4.ours(保留当前分支的版本,丢弃其他分支的变更)
git merge -s ours feature-branch
5.subtree(用于子树合并)
git merge -s subtree feature-branch
☘️ 最佳实践
1.合并前确保工作目录干净:使用git status检查
2.先拉取最新变更:先git fetch再git pull
3.理解合并方向:合并是单向操作,将其他分支合并到当前分支
4.对于个人分支可以考虑先rebase再合并
3.远程协作
git fetch(只下载,不合并)
git pull == git fetch + git merge(可能导致冲突)
建议:先git fetch,再git merge或git rebase,避免意外合并
git push -u origin <branch>

Part3:高级篇

1.stash(储藏)

git stash

注意:默认只储藏已跟踪文件的更改(git stash -u包括未跟踪文件)
注意:git stash pop应用并删除储藏,`git stash apply`只应用不删除
替代:临时提交(`git commit -m "WIP"`),之后 `git reset`撤销

2.rebase(变基)

git rebase <branch>

注意:会重写提交历史,​**​不要对已推送的分支使用​**​(除非团队允许)
注意:冲突需手动解决(类似 `merge`)
替代:`git merge`(保留分支历史)

3.Interactive Rebase(交互式变基)

git rebase -i HEAD~3

注意:可合并(`squash`)、编辑(`edit`)、删除(`drop`)提交
注意:仅限本地未推送的提交

4.cherry-pick merge(合并特定提交)

git merge <commit-hash>

5.dry-run(测试合并)

git merge --no-commit --no-ff feature-branch

Part4:常见问题解决

1.合并后想撤销

git reset --hard HEAD~1

2.合并了错误的分支

git reset --hard ORIG_HEAD