You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This discussion was converted from issue #13 on June 09, 2023 03:11.
Heading
Bold
Italic
Quote
Code
Link
Numbered list
Unordered list
Task list
Attach files
Mention
Reference
Menu
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
仓库管理
代码提交过程
创建本地仓库
保存工作
可保存多次、读取
提交代码
添加/ 放弃更改(到本地仓库暂存区):
提交更改(到本地仓库 HEAD,指向最后一次提交的结果):
合并多次提交(为一次):
git rebase -i HEAD~4 # 最近四次提交合并为一次
查看所有新建的/有提交记录的文件(untracked/ tracked)
查看所有忽略的文件:
远端仓库
远端仓库默认名为 origin,查看远程库信息:
克隆仓库(到本地),如克隆远端仓库,则会其别名为”origin“:
关联仓库(本地已存在的仓库与远端仓库关联):
更新本地仓库:
连接远端仓库:
推送到远端仓库(到指定分支):
删除操作
删除文件:
强制删除新建的文件(未提交过的):
删除远程仓库的文件:
标签管理
标签用于标记一个版本,表示版本库的一个快照(类似分支上的一个提交,但不能移动)。
查看标签:
切换分支,在分支上打上标签(最新的提交上):
在指定的提交上打上标签:
推送标签(的提交)到远端:
git push origin v1.0 git push origin --tags # 所有未提交的标签
删除标签:
git tag -d v0.1 # 如要删除的标签已经推送到远端,还需要执行: git push origin :refs/tags/v0.1
分支管理
在本地仓库上拉取指定分支:
创建并推送远程仓库分支:
管理策略
分支管理建议遵顼以下原则:
master
分支应该是非常稳定的,仅用来发布新版本,平时不能在上面工作;创建
dev
分支用于工作,dev
分支是不稳定的,比如 1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布 1.0 版本;开发组成员在
dev
的分支上工作,时不时地往dev
分支上合并即可。多人协作模式:
拉取远端主分支上的代码:
git clone [email protected]/learngit.git
;创建本地分支:
git checkout -b dev origin/dev
;修改后尝试
git push origin dev
推送自己的修改;推送失败表示远端分支比本地的更新,使用
git pull
试图合并;如
git pull
失败,要求先把本地和远端分支关联git branch --set-upstream-to=origin/dev dev
;合并发生冲突则解决,在本地提交;没有冲突或解决以后,再重新推送。
关于是否需要推送分支:
master
分支是主分支,因此要时刻与远程同步;dev
分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;bug
分支只用于在本地修复 bug,没必要推到远程;feature
分支是否推到远程,取决于是否团队成员合作在上面开发。Feature 分支
当添加实验性的新功能、又不希望把主分支搞乱可以新建一个 Feature 分支。
假设原在 dev 分支上开发,需要临时添加实验性的新功能 feature-vulcan,创建分支:
开发完成后提交:
切换回 dev 分支,准备合并:
但该新功能收到指示需要取消,需要删除分支:
Bug 分支
当出现紧急情况需要修复 bug,当前工作又还未完成,可以使用 stash 先把当前工作保存、再创建临时分支修复 bug,恢复现场后再继续工作。
假设在 dev 分支上工作,此时 master 分支上出现紧急 bug,先保存当前工作:
在 master 分支上创建临时分支:
修复后提交代码:
切换回出现 bug 的分支,合并,删除临时分支:
git checkout master git merge --no-ff -m "merged bug fix 101" issue-101
切换回 dev 分支上继续工作:
标准版本号
标准版本号格式:
X.Y.Z
,其中:X:主版本号,当添加了不兼容或颠覆性的更新时修改;
Y:次版本号,当添加了向下兼容的功能性修改时修改;
Z:修订号,当做了向下兼容的问题修正时修改。
其中 X、Y、Z 为非负整数,禁止数字前补 0,每个数值递增。
查看分支:
查看远程分支和本地分支对应关系:
关联远端分支:
使用分支
指定远程分支链接:
创建(并切换)分支、重命名:
切换分支:
git checkout - # 上一个分支
合并分支:
把 A 分支的某个 commit 放到 B 分支上:
删除操作
删除分支:
删除已经合并到 master 的分支:
删除远端已删除、本地剩余的分支:
保存备份
把某个分支导出成一个文件:
新建一个分支,内容为上面导出的文件:
合并多个 commit
(建议只在自己的分支上使用)使用 rebase 可以合并多个 commit 为一个完整的 commit。
比如在一个分支上的修改:
后面的 B、C、D 合并为一个完整提交,再推送到远端仓库:
可执行命令:
其中交互式的编辑指令:
pick/ p:保留该 commit
reword/ r:保留该 commit,但我需要修改该 commit 的注释
edit/ e:保留该 commit,但我要停下来修改该提交(不仅仅修改注释)
squash/ s:将该 commit 和前一个 commit 合并
fixup/ f:将该 commit 和前一个 commit 合并,但不要保留该提交的注释信息
exec/ x:执行 shell 命令
drop/ d:丢弃该 commit
将某段 commit 粘贴到另一分支
比如在某个分支上开发,有时需要将整段提交都应用到另一分支上,比如把下面 dev 分支上的 C、D、E 都合并到 master 分支的 G 后面:
可执行命令:
git rebase [start] [end] --onto [branchName] # 区间是前开后闭的,此处要指定 B 到 E 的 id git rebase 90bc0045b^ 5de0da9f2 --onto master
注意粘贴后 HEAD 处于游离状态,
git
只是将 C ~ E 部分的内容复制一份粘贴到了 master 所指向的提交后面,还需要将 master 所指向的提交 id 设置为当前 HEAD 所指向的提交 id:git checkout master # 切换到主分支,输出:this may be a good time to do so with: git branch <new-branch-name> 0c72e64 git reset --hard 0c72e64
fork 分支与主分支同步
本地添加远程主分支:
拉取主分支最新修改:
将 upstream 分支修改内容 merge 到本地个人分支:
将本地修改提交:
错误提交到某分支
撤销最后一次提交,并保留变更代码:
切换到正确到正确的分支,提交代码:
也可以使用 cherry pick:
git checkout name-of-the-correct-branch git cherry-pick master # 最后记得把错误提交的分支上提交删除 git checkout master git reset HEAD~ —-hard
问题排查
查看日志
查看当前状态(修改的、提交的、冲突的):
查看本地仓库日志:
查找相关记录:
git log --all --grep='<content>'
简化查看提交历史:
git log --pretty=oneline --graph --decorate --all git log --pretty=oneline --graph --abbrev-commit # 上新下旧
以树形结构查看所有分支日志:
查看两周内的改动:
git whatchanged --since='2 weeks ago'
查看本地更新过 HEAD 的 git 命令记录,如 commit、amend、cherry-pick、reset、revert 等,可以找到 commitId 并 reset 到任意一次:
错误恢复
回退版本:
本次操作失误后撤销修改:
本地操作失误后(已添加到暂存区)撤销修改:
本地操作失误后(已提交到版本库)撤销修改:
git reset --hard HEAD^ # 回退到上一版本
丢弃本地所有改动和提交,获取远端的最新版本,并把本地主分支指向它:
git fetch --all && git reset --hard origin/master
回到某个 commit 的状态,删除后面所有 commit:
把所有的改动重新放回工作区,删除所有 commit(目的是重新提交第一个 commit)
解决冲突
当 merge 出现冲突时,可查看冲突的文件:
git status # 此时直接打开文件 查看 <<<<<<<,=======,>>>>>>> 标记的内容,修改后保存重新提交即可(add、commit)
预览差异:
查看某个文件、任意分支的内容:
查看某段代码的作者:
配置及其他操作
忽略文件
编写
.gitignore
文件可以避免目录中的指定文件被提交,比如(可通过git status
检验):如果某些文件被
.gitignore
匹配,但又希望提交,可以强制添加:检查
.gitignore
,会提示在哪行的规则匹配了指定的文件:基本配置
设置姓名和邮箱地址:
命令别名:
git config --global alias.st "status"
修改作者名:
git commit --amend --author='Author Name <[email protected]>'
设置 SSH Key:
优化显式效果
内建图形化工具:
彩色的 git 输出:
显示历史记录时,每个提交的信息只显示一行:
其他
如果当前修改的文档在本地的 master 上,然后想把这个修改迁移到一个 branch 上,方便做 PR,如果这些修改还没有被 add,可使用
git checkout -b new_branch_name
来完成。如果 commit 后,还没有 push,想修改一下这前的 commit,可以使用
git commit --amend
使用
git pull --rebase
可以避免出现一个 merge buble。如果要删除远程分支,可以使用
git push origin --delete <remote-branchname>
使用
git add -p
可以让挑选修改,可以把的一次大改动变成多个提交。git checkout -p
和git add -p
类似,可挑选想 checkout 的修改。可以让使用时间显示在 git 命令行上,比如:
git diff HEAD@{'2 months ago'}
或git diff HEAD@{yesterday}
或git diff HEAD@{'2010-01-01 12:00:00'}
参考
Beta Was this translation helpful? Give feedback.
All reactions