?
实践沙箱教程:
https://learngitbranching.js.org/
?
一、Git分区
? ??分布式版本控制系统,没有中央服务器,每个人的电脑都有一个完整的版本库
Workspace:工作区,即电脑上看到的目录
Index/Stage:暂存区,add命令就是把文件从工作区添加到暂存区
Respository:仓库区(本地仓库)
Remote:远程仓库
?
二、配置操作
1、显示当前配置
git config --list
?
2、编辑配置文件
git config -e [--global]
?
3、设置提交代码时的全局用户信息
git config --global user.email "12345678@qq.com"
git config --global user.name "nobug"
?
三、本地常用操作
1、git init —创建版本库
??版本库即repository,即一个目录,工作区里的隐藏目录 .git,其中最重要的是存了暂存区(stage),【以及自动创建的第一个分支master,和指向master的一个指针HEAD】,目录中每个文件的修改、删除都能被git跟踪
# 创建一个版本库
git init
?
2、git add —提交文件到暂存区
# 提交目录里的test.txt到暂存区
git add test.txt
# 提交目录中所有文件到暂存区中
git add *
# 添加指定目录到暂存区,包括子目录
git add [dir]
# 添加当前目录的所有文件到暂存区
$ git add .
# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
git add -p
# 删除工作区文件,并且将这次删除放入暂存区
git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
git mv [file-original] [file-renamed]
?
3、git commit —提交文件到仓库
把暂存区的所有内容提交到当前分支上
# 提交暂存区到仓库区
git commit -m [message]
# 提交暂存区的指定文件到仓库区
git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区
git commit -a
# 提交时显示所有diff信息
git commit -v
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
git commit --amend -m [message]
# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...
?
4、git status —查看文件提交情况
git status
?
5、git reset —撤销变化
# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
git reset [file]
# 重置暂存区与工作区,与上一次commit保持一致
git reset --hard
# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
git reset [commit]
# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset --hard [commit]
# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
git reset --keep [commit]
?
5.1 HEAD
HEAD 总是指向当前分支上最近一次提交记录, HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见
如果想看 HEAD 指向,可以通过 cat .git/HEAD 查看, 如果 HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向
分离的头指针:
分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。在命令执行之前的状态如下所示:
HEAD -> main -> C1
HEAD 指向 main, main 指向 C1
git checkout C1 此时HEAD指向C1
# ^ 向上移动一个提交记录
# ~3 向上移动3个提交记录
git checkout bugFix^
可以直接使用 -f 选项让分支指向另一个提交
git branch -f main HEAD~3
?
5.2 利用HEAD进行reset
# 回退到上个版本,在reset后
git reset --hard HEAD^
# 回退到上上个版本,两个^
git reset --hard HEAD^^
# 回退到前100个版本
git reset --hard HEAD~100
# 恢复回退的版本,通过git reflog 找到对应版本号
git reset --hard 6fcfc89
?
6、git revert —远程分支回退
# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
git revert [commit]
?
7、git rebase —分支移动
我们想要把 bugFix 分支里的工作直接移到 main 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。
新建并切换到 bugFix 分支
提交一次
切换回 main 分支再提交一次
再次切换到 bugFix 分支,rebase 到 main 上
git checkout -b bugFix
git commit
git checkout main
git commit
git checkout bugFix
git rebase main
?
7.1 交互式rebase
交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i
git rebase -i HEAD~4
通过rebase -i,可以
- 调整提交记录的顺序
- 删除不想要的提交
- 合并提交, 它允许你把多个提交记录合并成一个
?
8、git branch —新建分支
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 列出所有本地分支和远程分支
git branch -a
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
# 新建一个分支,指向指定commit
git branch [branch] [commit]
# 新建一个分支,与指定的远程分支建立追踪关系
git branch --track [branch] [remote-branch]
# 建立追踪关系,在现有分支与指定的远程分支之间
git branch --set-upstream [branch] [remote-branch]
# 删除本地分支
git branch -d [branch-name]
# 删除远程分支
git branch -dr [remote/branch]
# 设置远程追踪分支
# 下面命令设置foo分支追踪远程仓库分支origin/main
git branch -u origin/main foo
?
9、git checkout —切换分支
# 新建一个分支,并切换到该分支
git checkout -b [branch]
# 切换到指定分支,并更新工作区
git checkout [branch-name]
# 切换到上一个分支
git checkout -
# 新建一个分支,指向某个tag,(此时会进入头指针分离状态)
git checkout -b [branch] [tag]
# 新建空分支
git checkout --orphan null
git rm -rf .
# 恢复暂存区的指定文件到工作区
git checkout [file]
# 恢复某个commit的指定文件到暂存区和工作区
git checkout [commit] [file]
# 恢复暂存区的所有文件到工作区
git checkout .
# 设置远程追踪分支
# 下面命令设置foo追踪远程分支origin/main
git checkout -b foo origin/main
?
10、git cherry-pick —整理提交记录
# 将一些提交复制到当前所在的位置(`HEAD`)下面
git cherry-pick 30ab319f1c1544934b9b746b3f5e8cb7f301978b 45d1161d979e60167f4b2faceda2e9189218bce0
?
11、git merge —合并分支
# 合并指定分支到当前分支
git merge [branch-name]
# 通常合并分支时,git一般使用”Fast forward”模式,在这种模式下,删除分支后,会丢掉分支信息
# 使用参数 –no-ff来禁用”Fast forward”模式
git merge --no-ff -m "注释" [branch-name]
git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中<<<HEAD是指主分支修改的内容,>>>>>[branch-name]是指[branch-name]上修改的内容
?
12、git stash —暂存工作区修改
# 隐藏当前工作现场
git stash
# 查看工作现场
git stash list
# 恢复现场
git stash pop
# 恢复指定现场,不指定则默认为最近一次的进度 git stash pop stash@{0}
git stash pop stash@{num}
# 恢复指定现场且可重复恢复
git stash apply stash@{num}
# 删除一条指定保存的工作进度
git stash drop stash@{num}
# 删除所有保存的工作进度
git stash clear
?
13、git tag —创建标签
# 列出所有tag
git tag
# 新建一个tag在当前commit
git tag [tag-name]
# 新建一个tag在指定commit(hash)
git tag [tag-name] [commit]
# 删除本地tag
git tag -d [tag]
# 删除远程tag
git push origin :refs/tags/[tagName]
# 查看tag信息
git show [tag]
# 提交指定tag
git push [remote] [tag]
# 提交所有tag
git push [remote] --tags
?
14、git log —查看操作记录
# 显示当前分支的版本历史
git log
# 显示当前分支的最近几次提交
git reflog
# 显示commit历史,以及每次commit发生变更的文件
git log --stat
# 搜索提交历史,根据关键词
git log -S [keyword]
# 显示某个commit之后的所有变动,每个commit占据一行
git log [tag] HEAD --pretty=format:%s
# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
git log [tag] HEAD --grep feature
# 显示某个文件的版本历史,包括文件改名
git log --follow [file]
# 显示指定文件相关的每一次diff
git log -p [file]
# 显示过去5次提交
git log -5 --pretty --oneline
?
四、远程仓库常用操作
1、git clone —下载远程仓库
# 根据url下载远程仓库
git clone https://github.com/wechatpay-apiv3/wechatpay-go.git
?
2、git fetch —下载远程仓库更新
# 下载远程仓库的所有变动
git fetch [remote]
# 只下载远程仓库指定分支bar
git fetch origin bar
# 下载远程仓库指定分支到本地不同名分支 [git fetch origin <source>:<destination>]
# 下载远程仓库bar分支到本地foo分支
git fetch origin bar:foo
# 下载空分支,会在本地创建一个新分支
git fetch origin :bugFix
?
3、git remote —查看远程仓库信息
# 显示所有远程仓库
git remote -v
# 显示某个远程仓库的信息
git remote show [remote]
# 增加一个新的远程仓库,并命名
git remote add [shortname] [url]
?
4、git pull —拉取远程仓库最新变化
git pull = git fetch+git merge
git pull --rebase = git fetch + git rebase
# 取回远程仓库的变化,并与本地分支合并
git pull [remote] [branch]
?
5、git push —推送本地变化到远程仓库
# 上传本地指定分支到远程仓库
git push [remote] [branch]
# 强行推送当前分支到远程仓库,即使有冲突
git push [remote] --force
# 推送所有分支到远程仓库
git push [remote] --all
# push 空 到远程仓库,会删除远程仓库中的分支
# 下面的操作会删除远程仓库中的side分支
git push origin :side
?
五、其他操作
1、git diff —查看文件差异
# 显示暂存区和工作区的差异
git diff
# 显示暂存区和上一个commit的差异
git diff --cached [file]
# 显示工作区与当前分支最新commit之间的差异
git diff HEAD
# 显示两次提交之间的差异
git diff [first-branch]...[second-branch]
# 显示今天写了多少行代码
git diff --shortstat "@{0 day ago}"
?
2、git show —查看文件内容变化
# 显示某次提交的元数据和内容变化
git show [commit]
# 显示某次提交发生变化的文件
git show --name-only [commit]
# 显示某次提交时,某个文件的内容
git show [commit]:[filename]
?
六、疑难杂症
1、修改之前分支的某次提交
如果之前在 A1 分支上进行了一次提交,然后又基于它创建了 B1 分支,然后又提交了一次。此时想对A1 进行一些小小的调整,尽管A1 提交记录并不是最新的了
解决方法一:
- 先用 git rebase -i 将提交重新排序,然后把想要修改的提交记录(A1)挪到最前
- 然后用 git commit --amend 来进行一些小修改
- 接着再用 git rebase -i 来将他们调回原来的顺序
- 最后把HEAD移到修改的最前端
解决方法二:
- git checkout main
- git cherry-pick A1
- git commit --amend
- git cherry-pick B1
(还有很多其他方法)
?
2、远程服务器拒绝直接push到master
因为策略配置要求 pull requests 来提交更新
解决方法:
??新建一个分支feature, 推送到远程服务器. 然后reset你的master分支和远程服务器保持一致
?
3、删除远程仓库的提交
方法一:
需要有对应分支的强制提交权限
# 回退到上一次提交
git reset HEAD^
# 强制提交
git push origin master -f
?
方法二:
需要有对应分支的强制提交权限
git log 查看需要删除哪次提交之后的提交
# 删除某次提交后的所有提交
git rebase -i 46257e257f416e75631b496c151bbbf1096be2a1
git push origin master -f
?
4、删除远程仓库分支
# push 空 到远程仓库,会删除远程仓库中的分支
# 下面的操作会删除远程仓库中的side分支
git push origin :side
?
5、恢复被删除的文件
5.1 add后但没有commit前
git checkout --b.txt
?
6、merge和rebase的优缺点比较
? ? 如有不对,烦请指出,感谢~
|