🪐写在前面: 本文章针对于git使用不熟练的朋友以及在使用 git 时可能遇到的一些case如何解决。如果你对Git已经很熟练了,那么本文你可以略过啦~
一、本地仓库操作
1.创建与获取仓库
# 在当前目录初始化一个新的 Git 仓库
git init# 克隆一个远程仓库到本地
git clone <远程仓库URL>
2. 查看状态与历史
# 查看工作区和暂存区的状态(最常用的命令)
git status# 查看提交历史
git log
git log --oneline # 简洁模式显示 例:git log --oneline --grep="用户登录功能"
git log --graph # 图形化显示分支合并历史
git log -p # 显示每次提交的内容差异# 查看工作区中文件的更改(尚未暂存)
git diff# 查看已暂存的文件更改(已 add 但未 commit)
git diff --staged
3. 跟踪与提交更改
# 将文件的修改添加到暂存区(跟踪更改)
git add <文件名>
git add . # 添加当前目录下所有更改# 将暂存区的内容提交到本地仓库
git commit -m "提交信息的描述"# 修改上一次的提交信息(前提是还没推送到远程)
git commit --amend
4. 撤销与回退
# 撤销工作区中某个文件的修改(危险操作,不可恢复)
git checkout -- <文件名> git restore <文件名># 将文件从暂存区移除,但保留工作区的修改
git reset <文件名># 回退到某个提交,并丢弃之后的提交历史(谨慎使用!)
git reset --hard <commit_id># 撤销某次提交,但不破坏历史提交(更安全,推荐)
git revert <commit_id>
场景:使用 git revert 撤销提交:
# 1. 发现生产环境有bug,需要紧急回滚某个功能
git log --oneline --grep="用户登录功能"
# 2. 找到引入问题的提交
# 假设提交ID是 abc1234
# 3. 创建revert提交
git revert abc1234 -m "紧急回滚:用户登录功能存在安全漏洞"
# git 自动生成 commit,不需要手动执行 git commit
# 4. 推送到远程
git push origin main
# 5. 团队其他成员拉取更新
git pull origin main
5.分支管理
# 查看所有分支
git branch# 创建新分支
git branch <新分支名># 切换到指定分支
git checkout <分支名> 或 git switch <分支名># 创建并切换到新分支
git checkout -b <新分支名> 或 git switch -c <新分支名># 删除分支(如果分支未合并,会失败)
git branch -d <分支名>
# 强制删除分支
git branch -D <分支名># 将当前分支与指定分支合并
git merge <要合并过来的分支名># 查看历史提交
git checkout <commit-hash> git switch --detach <commit-hash>
二、远程仓库协作
1.查看与连接
# 查看已配置的远程仓库
git remote -v# 添加一个远程仓库地址,并起一个别名(通常 origin 是默认的)
git remote add <别名> <远程仓库URL>
2. 获取与拉取
# 从远程仓库获取更新,但不会自动合并到工作区
git fetch <远程仓库别名># 从远程仓库获取更新,并自动与当前分支合并(= git fetch + git merge)
git pull <远程仓库别名> <远程分支名># 推荐使用 rebase 方式拉取,可以使历史线更整洁
git pull --rebase <远程仓库别名> <远程分支名>
3.推送
# 将本地分支推送到远程仓库
git push <远程仓库别名> <本地分支名># 删除远程分支
git push <远程仓库别名> --delete <远程分支名>
三、常见问题与解决
如果我们修改了boe分支,此时想要更改feat/add-harmony使之与boe分支一样,那么可以执行以下命令,执行完后,远程feat/add-harmony会合上新代码,此操作不需要申请权限。
# 强制覆盖
git checkout feat/add-harmony
git reset --hard boe
git push origin feat/add-harmony
本地分支下修改四处代码执行了四次git commit操作,但是没有push到仓库,同时又在该分支下进行了别处的修改,这个修改没有执行git commit,如何将这五处修改一起提交到仓库去?
# 暂存所有修改
git add.
# 重置最近四个提交(保留更改)
git reset --soft HEAD~4
# 创建新提交
git commit -m "合并所有修改"
# 强制推送
git push origin 分支名 --force
# 缺点:会丢失原有commit信息
如果使用git checkout 分支名切换到别的分支,此时如果当前分支的修改没有提交(commit)或储藏(stash),那么Git会阻止你提交。如何做?
1、使用 git stash:作用是:将您在工作区和暂存区中所有“未提交的更改”(包括已 git add 的和未 git add 的)保存到一个临时的存储栈中。将您的代码库恢复到最后一次提交 的状态。
此时如果想继续修改工作区,并且希望恢复之前储藏的那些更改,需要执行 git stash pop,此时工作区已经恢复,可继续接着上次的进行修改,然后执行git add 和 git commit 将修改提交到本地仓库了!
2、使用 git commit
此时如果想继续修改刚才已经执行 git commit 的工作区,需要执行 git commit --amend,作用:修改最近一次提交,amend 操作会替换原来的提交,生成一个全新的提交ID,注意:该操作只能修改当前分支的最近一次提交。
使用Git管理时,对工作区的代码A进行修改后,执行 git add和git commit,但是此时发现刚才对于代码A的修改不正确,而此时代码A已经执行了git commit操作,如何撤销 git commit操作,重新对代码A进行修改?
1、执行 git commit --amend:修改最近一次提交,覆盖之前的提交操作,生成一个全新的提交ID,历史提交记录中不会出现上次的提交操作。
2、执行 git reset --soft HEAD~1:撤销最近一次提交,但保留更改在暂存区。注意,执行完该命令后,如果继续对该提交进行修改,修改完之后要执行 git add 你修改的文件名,否则会出现工作区和暂存区内容不一致的情况!(撤销此操作:git reset --soft HEAD@{1})
3、执行 git reset --hard HEAD~1(谨慎使用!):撤销提交并且丢弃所有工作区和暂存区的更改,此时工作区会完全恢复到上一次提交时的状态,上一次的修改会全部消失!
如果此时你已经推送到远程仓库了怎么办?
执行 git push --force-with-lease:该命令相比于git push --force 的好处是会对你本地存储的远程分支记录和实际远程分支记录对比,如果不一致,说明远程分支有了你本地未知的新提交,则拒绝提交。这样做是为了避免你的提交覆盖之前你的队友的提交。
如果被拒绝推送,说明远程分支有了你本地未知的新提交,如何处理?
1、# 获取远程最新状态,但不会自动合并
git fetch origin2、执行 git rebase origin/feature/login 或 执行 git merge origin/feature/login
PS:如果在rebase或merge时出现冲突:
# Git会提示冲突文件,你需要手动解决
# 编辑标记为冲突的文件,解决后:
git add <解决冲突的文件>
git rebase --continue # 如果正在rebase
# 或
git commit -m "解决合并冲突" # 如果正在merge此时,可以安全地强制推送了:
git push --force-with-lease origin feature/login
在使用 git 时,如果想标记重要的版本节点(如 v1.0.0),如何做?
# 创建一个带注释的标签
git tag -a v1.0.0 -m "Release version 1.0.0"# 将标签推送到远程仓库
git push <远程仓库别名> v1.0.0
你在 master 分支下创建了一个新分支,在你开发过程中,其他成员修改并提交了其他分支到 master,或者你已经同步了 master 的最新更改到你的分支,但是在 Merge 时,出现了冲突,此时如何处理?
git checkout feat/my-feature
git pull --rebase origin master
# 解决冲突(如果有)
git add .
git rebase --continue# 推送到远程(更安全,会先检查远程分支是否有人更新过,如果没人更新才允许覆盖)
git push origin feat/my-feature --force-with-lease
更多文章:git的底层原理详解-CSDN博客
1万+

被折叠的 条评论
为什么被折叠?



