参考
廖雪峰git教程-推荐
git图解
分支命名规范
ps:图都是别人的
1.基本概念
区域
- 四个区域:工作区(Working Directory)暂存区(stage/index)本地版本库(Local Repository)远程版 本库(Remote Repository)他们之间关系如下:
-
分支branch
- 主分支(master/main)(主分支,永远是可用的稳定版本,不能直接在该分支上开发)
- develop(开发主分支,所有新功能以这个分支来创建自己的开发分支,该分支只做合并操作,不能直接在该分支上进行开发)
- feature-xxx(功能开发分支,在develop上创建分支,以自己开发功能模块命名,功能测试正常后合并到develop分支)
- feature-xxx-fix(功能bug修复分支,feature分支合并之后发现bug,在develop上创建分支进行修复,之后合并回develop分支)
标签tag
- 标签是用于标记特定的点或提交的历史,不能更改
head
- 当做一个指针,HEAD 指向的就是当前分支的最新提交的节点;
.gitignore
官方模板,照着用就行
把不需要推送的文件放在里面,git会忽视这些文件。
比如:
.vscode/*.json
#C++
# Prerequisites
*.d
# Compiled Object files
*.slo
*.lo
*.o
*.obj
2.基本操作
-
git clone "远程仓库地址"
#包含init操作; -
git init
#本地初始化一个仓库 -
git remote add origin "地址"
#init 后 与远程仓库建立链接;origin是远程主机名 -
git fetch
#默认取回所有分支的更新, -
git pull (origin "远程分支名" : "本地分支名"
) # 完整写法;如果同名 不用写本地分支名,如果关联好了 只写git pull 即可,pull操作直接将远程仓库拉取到工作区! -
git add "文件"
#把修改的文件 加入到暂存区 git rm 和git mv 同理 -
git status
#查看仓库状态-s
参数会更简洁 -
git diff “文件名”
#查看暂存区和本地仓库文件差异 -
git commit -m "第一行说明" -m “第二行说明”
# 提交到仓库 ,-am 多行提交原因 -
git log (--pretty=oneline)
# 查看提交历史记录git log --graph --pretty=oneline --abbrev-commit
常用这个 -
git reset --hard HEAD~n/commit_id
# 回退到某个版本,会修改工作区暂存区、版本库;soft保留工作区和暂存区,mixed保留工作区; -
git branch -a/-r
#查看分支/远程仓库分支-d/-D “分支名”
删除/强制删除分支 -
git checkout -b '分支名'
#基于当前所在分支创建新分支并切换到新分支; 等价于git branch 'dev'
+git switch 'dev'
-
git push -u origin "本地分支名"
# 将本地分支和远程同名分支关联;如果远程没有该分支,则在远程创建该分支。 -
git push origin -d "分支名"
# 删除本地和远程仓库分支,branch -r -d origin/分支名
只是删除追踪分支 -
git merge "分支名" --no-ff
# 合并某分支到当前分支,并且不使用快速合并,保留信息 -
git push origin “本地分支名”:"远程分支名"
# 将本地仓库推到远程仓库;
3.命令说明(慢慢整理)
命令:
/add / commit /merge
/fetch /push /pull
/remote /branch /checkout
/rebase /stash /git cherry-pick
/reset /revert /restore
/log /relog /diff
3.1 add/rm/mv
使用git rm/mv 相当于先 rm/mv 在git add添加;
git add -f/--force #强制添加某文件,可用于添加在.gitignore中的文件
3.2 push/pull/fetch
pull = fetch+merge
#同步远程仓库到本地仓库
git fetch "分支名"
# 关联到同名远程库,没有则创建同名远程库
git push -u origin <本地分支名>
#关联后 :
git push
git pull
#未关联推送到同名库
git push origin <本地分支名>
git pull origin <远程分支> #不要反了!!
#完整命令:
git push origin <本地分支名>:<远程分支名>
git pull origin <远程分支名>:<本地分支名>
# 删除远程仓库
git push origin -d "分支名"
3.3 remote/
关于远程仓库操作
git remote add "远程主机名默认origin" "地址"
git remote -v #显示链接的远程仓库
3.4 stash
将工作保存在栈中,
git stash
git stash list
git stash pop
git stash apply ID
git stash drop ID
3.5commit/merge/cherry-pick
git commit "文件" -m "说明1" -m "说明2"
git merge "分支名" #默认快速合并
git merge -no-ff -m "merge fix bug 01" #推荐方式
git cherry-pick commitHash #合并其他分支上的某次提交
3.6 log/reflog
log 可选参数很多
git log --pretty=oneline #单行显示
git log --graph # 图
git log -5 # 显示最近5次提交
3.7 diff
3.8 branch/switch/checkout
checkout命令在早期版本中具有分支管理和文件恢复两个核心功能,但这些功能在2.23版本之后被分化为switch和restore两个独立命令。因此,如果您只需要创建和切换到新分支(不需要检出文件或撤销更改等),建议使用switch命令。switch命令可以更好地保证分支操作的安全性,因为它禁止在未提交的更改上切换分支(除非使用 --discard-changes 选项丢弃更改)
git branch -m <branch-name> #重命名
git branch <branch-name> #创建新分支
git branch -a #查看所有分支
git branch -v # 查看远程分支
git branch #查看
git branch -r -d/-D "分支名" #删除跟踪分支、本地分支;想删除远程分支要使用push -r就是 --remote
git switch branch #切换分支
git switch -c newbranch (ori_branch) #创建并切换到新的分支
git checkout -b newbranch (ori_branch) #创建并切换到新的分支
3. restore/reset/revert
restore命令用于恢复工作区的文件。它可以将文件从暂存区(index)或提交(commit)中还原到工作区。
reset本质是 重置/移动HEAD指向的节点(连带着branch)。
revert 原理是通过提交新的从而覆盖之前的问题
git restore <file>
git restore <file> --source=HEAD #将文件从暂存区还原到工作区。
git restore <file> --source=<commitHash> #将文件从指定提交中还原到工作区。
git reset --hard HEAD^/HEAD~n/commitHash #回退到某个节点,工作区暂存区本地仓库全部回退
git reset --mixed ... # mixed也是默认参数,只对暂存区和本地仓库有影响,保留工作区内容
git reset --soft ...#只对仓库有影响,暂存区和工作区都保留(应该说暂存区会存放重置HEAD带来的差异)
git revert commitHash
4.练习
都是简单问题,必须要掌握
4.1 同步/多人协作
你在本地仓库工作,现在远程仓库更新了,你该怎样同步更新,并继续你的工作?
git fetch origin #获取远程库更新内容到本地仓库
#如果 不影响你的工作,那就不用 合并,反之需要合并
git switch "工作分支"
git merge origin/"要合并的branch" # 如果有冲突,要先解决冲突;git pull 等价于 fetch+merge?
#之后正常操作
git add ..
git commit -m ""
git push origin "本地分支"
4.2 bug分支
dev或者master上发现bug 怎么修改:本地创建分支bug_fix007,修改后合并到主分支上
git checkout -b bug_fix007 dev
#修改完毕后
git push -u origin bug_fix007 #创建远程同名分支并推送,
#or
git switch dev
git merge bug_fix007 -m "merge bug_fix007"
你当前工作未完成,但是此时需要你去处理代码中其他的问题,比如修复一个bug或者马上要提交另一个分支,或者多人协作时,当前工作未完成,为了避免和别人冲突,需要将改动暂时存储起来,怎么办?
#使用stash将未提交的文件保存在栈里面,此时使用git status 会发现工作区变干净了
git stash
git switch master #切换到需要修改的分支上
git branch -m issue-01 #在dev分支晌创建临时分支issue-01
git add
git commit -m "fix bug 01"
git switch dev
git merge -no-ff -m "merge fix bug 01" #bug修改完
git switch dev #回到之间的工作
git status #干净的工作区
git stash list #查看栈,
git stash apply (stash@{n}) #恢复内容,stash内容不删,默认是栈顶,也可以指定 n,n通过list查看。
git stash drop #删除stash的内容 也可直接使用 pop出栈
此时存在一个问题,那就是dev也是从master来的,所以这个bug dev上面也有,那怎么快速解决该问题?
git cherry-pick commitHash
其他解决方式:先用git stash保存未完成工作; 然后在dev上修复这个bug,
关于stash其他操作还有很多,注意的是stash只能保存那些已经被追踪的文件,如果你新建了一个文件,没有add,那么不会被跟踪,stash无效,在其他分支也是可以看到的。
4.3 回退
如果发现提交的内容有错误,可能是在暂存区中,也有已经提交到本地仓库中的,怎么办;
# 如果是在暂存区中:
git restore --staged <文件>... # git status 会自动提示 取消暂存
# 如果已经提交到仓库 那么两种办法:一种是commit提交修改后的,但是会又提交记录;第二种是使用reset,这样在log中就不会出现。
git log #查看commit记录
git reset --hard HEAD^/HEAD~n/commitID #回退到某个节点,工作区暂存区本地仓库全部回退
git reset --mixed # mixed也是默认参数,只对暂存区和本地仓库有影响,保留工作区内容
git reset --soft #只对仓库有影响,暂存区和工作区都保留(应该说暂存区会存放重置HEAD带来的差异)
你想要撤回提交到远程库的内容。其他不关心,如何操作
git pull
git reset --hard/soft/mixed HEAD^
git push -f #强行推送
你想要撤回提交到远程库的内容。这时可能会想到用 reset 回退,可是你看了看分支上最新的提交还有其他同事的代码,用 reset 会把这部分代码也撤回了,此时怎么办?
git pull
git log -10 #查看最近十次commit 找到自己提交的哈希值
git revert commit_id #创建一个新的提交,来弥补之前的错误
git revert -m 1 <commitHash> #有时出现不知道哪个是主线,则使用该命令 遇到再说
如果误用了
reset --hard
或者记错了commitHash,怎么办
git reflog # 强力后悔药,查找命令记录,找到错误提交的那次 commitHash /
git reset --hard commitHash
4.4分支问题
使用
git clone
时,默认只能看到本地的master
分支,如果想要在dev分支上开发怎么办?
git clone ""
git branch #发现只有master
git checkout -b dev origin/dev #创建远程origin的dev分支到本地
# 在本地修改后 推送
git branch --set-upstream-to=origin/dev dev #链接本地和远程分支,push/pull失败后git会提示,
git push origin dev #
如果本地创建一个分支,远程没有,想要把本地推送到远程同名仓库
git checkout dev
git checkout -b feature_01 #从dev上创建一个新的分支feature_01
git push -u origin feature_01
#这条命令的作用是将本地的 feature_01 分支推送到远程仓库(origin)的 feature_01 分支。
#同时,如果远程仓库还没有 feature_01 分支,这条命令会自动创建。-u 参数表示设置 dev 分支为默认推送分支。
远程origin/dev 分支太落后,怎么更新
git switch master
git pull
git checkout -b dev origin/dev #创建本地分支
git merge master -m "update dev" #合并
git push (-f origin dev:origin/dev) #推送
5 补充知识
5.1关于commitHash
git reflog发现几次命令历史的commithash一样 \
- git reflog可以发现多次命令历史的commit hash一样,是因为它们对应的是同一个提交。
每次提交都会生成一个独特的commit hash,这个hash是根据提交的内容和其他相关信息计算出来的。
因此,如果在不同的分支或操作中,提交的内容完全相同,那么它们生成的commit hash也会一样。
- 例如,如果在某个分支上进行了多次提交,然后在另一个分支上又进行了相同的提交,
那么这两个提交的commit hash就会一样。这是因为它们对应的都是同样的提交内容。
- 另外,git reflog可以查看所有分支的所有操作记录,包括commit和reset的操作,可以用来恢复误删的分支或找回丢失的提交。
其中,commit记录包含了提交的完整信息,而reset记录则表示将HEAD指针移到了之前的某个提交。