做网站的如何找客户,wordpress 多米 主题,wordpress非插件幻灯片,徐汇制作网站哪家好前言
本文参考于 Learn Git Branching 这个有趣的 Git 学习网站。
在该网站#xff0c;可以使用 show command 命令展示所有可用命令。
直接访问网站的sandbox。
本地篇
基础篇
git commit
git commit将暂存区的修改提交到本地版本库并创建一个新的提交#xff0c;新提…前言
本文参考于 Learn Git Branching 这个有趣的 Git 学习网站。
在该网站可以使用 show command 命令展示所有可用命令。
直接访问网站的sandbox。
本地篇
基础篇
git commit
git commit将暂存区的修改提交到本地版本库并创建一个新的提交新提交会指向前一个提交。
git commit -m C2main分支是默认主分支。*表示当前分支所在也是HEAD指针指向。我们的提交记录会提交到当前分支。
直接运行git commit会打开Git默认编辑器。
git branch
git branch在此前工作的基础上创建新的分支来指向当前的提交以此来进行新的工作。
创建一个名为newImage的分支
git branch newImage*号依然位于main说明当前分支仍然是main。
使用以下命令切换到新分支上
git checkout newImageGit 2.23 版本引入了 git switch branch-name 命令来取代 git checkout命令众多功能中的切换分支功能。
最后git branch branch-name和git checkout branch-name可以合并为一条命令
git checkout -b branch-namegit merge
在新建分支开发完新功能或修复完 Bug 后我们可以将其合并回主分支。
合并bugFix分支到main分支
git merge bugFix非快进合并
可以看到合并分支时创建了新提交新提交的parent提交是两个分支合并之前的最新提交。
再把main分支合并到bugFix
git switch bugFix
git merge main快进合并Fast Forward
git rebase
git rebase是另一种分支合并的方式称为变基具体是把一系列的提交记录复制到另一个地方。
使用git rebase可以使得提交历史更加线性。
git rebase maingit rebase main将当前分支*所在bugFix从与main分支的公共祖先提交部分开始的提交记录复制到以main分支的最新提交为起始的地方但复制不是真的复制是解决冲突后的复制如图复制后的C3提交已经与原提交C3不同了。
git rebase main中的main就是基分支bugFix就是变基分支。
高级篇在提交树上移动
HEAD 简介与 HEAD 分离
HEAD 是一个指针通常指向当前分支名偶尔也会指向当前提交。
git checkout C1 # 切换到 C1 提交
git checkout main # 切换到 main
git commit -m C2 # HEAD 指向的 main 指向 C2
git checkout C2 # 切换到 C2 提交像git checkout C1这样将 HEAD 指针指向提交C1的行为称为 HEAD 分离Detached HEAD。分离前HEAD 指向的是分支引用 main。
git checkout C1中的C1其实是提交的HASH值。
查看提交记录的哈希值
git logHASH 值很长但我们只需要其前面几位可以唯一标识提交的即可例如63dbb453fbae3d151622f4e91d3aadf90069552d我们取63dbb。
查看 HEAD 指向
cat .git/HEAD如果 HEAD 指向引用而非提交也可以像下面查看 HEAD 指向
git symbolic-ref HEAD相对引用
前文使用 HASH 值来指定提交记录这也叫做直接引用难免不方便Git 提供了相对引用的方式来指定提交
branch-name^branch-name指向的提交的上一个提交。branch-name^^branch-name指向的提交的前面第二个提交。branch-name~~numbranch-name指向的提交前面第num个提交。
git checkout main^强制修改分支位置
除了切换分支相对引用用的最多的地方是移动分支。
git branch -f main HEAD~3如果要移动的分支不存在会自动创建。
撤销变更
git reset
git reset回退到直接引用或相对引用指向的提交记录之后的提交记录就撤销了。
git reset HEAD^C2提交被reset后就不存在于本地版本库中但是其变更还在只不过处于未暂存状态。
git reset只对本地分支有效无法回退远程分支。
进行git reset后如果进行推送Git 会提示远程仓库较新需要git pull你的代码被远程仓库覆盖。如果想要回退生效则需要追加-f进行强制推送。
git revert
reset 英文意思有“复位”。
revert 英文意思有“恢复”。
git revert会创建新提交来撤销更改它与待撤销提交的前面某个提交内容是相同的。
git revert HEAD移动提交记录
git cherry-pick
git chery-pick用于把一些提交复制到当前提交HEAD的下面。
git cherry-pick C2 C4交互式 rebase
git rebase 后追加 --interactive 或 -i 选项会打开一个窗口你配置的编辑器显示将要被复制到目标分支的提交的哈希值和提交说明。
一个打开的示例窗口如下
pick 63dbb45 2# Rebase 88e2af2..63dbb45 onto 88e2af2 (1 command)
#
# Commands:
# p, pick commit use commit
# r, reword commit use commit, but edit the commit message
# e, edit commit use commit, but stop for amending
# s, squash commit use commit, but meld into previous commit
# f, fixup [-C | -c] commit like squash but keep only the previous
# commits log message, unless -C is used, in which case
# keep only this commits message; -c is same as -C but
# opens the editor
# x, exec command run command (the rest of the line) using shell
# b, break stop here (continue rebase later with git rebase --continue)
# d, drop commit remove commit
# l, label label label current HEAD with a name
# t, reset label reset HEAD to a label
# m, merge [-C commit | -c commit] label [# oneline]
# create a merge commit using the original merge commits
# message (or the oneline, if no original merge commit was
# specified); use -c commit to reword the commit message
# u, update-ref ref track a placeholder for the ref to be updated
# to this position in the new commits. The ref is
# updated at the end of the rebase
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#使用git rebase经常会遇到要解决冲突的情况解决冲突后执行git add和git rebase --continue。 杂项
只复制一个提交
有时候我们开发完一个功能需要与主分支进行合并时会希望只合并我想要的那个提交。
我们知道使用git merge的合并有快进合并和非快进合并两种。但是这两种合并会将我们不需要的提交也包含在主分支中。
这时候我们可以使用git cherry-pick或git rebase -i来完成。 如上图我想要将修复问题后的提交bugFix合并到main。
如果使用git merge
git checkout main
git merge bugFix这使得主分支 main 中就包含了 C2、C3 这些提交。
使用git cherry-pick
git checkout main
git cherry-pick C4
git branch -f bugFix main修改前面的提交但不在主分支创建新提交1 这样做就唯一的问题就是要进行两次排序而这有可能造成由 rebase 而导致的冲突。
修改前面的提交但不在主分支创建新提交2 git checkout main
git cherry-pick C2
git commit --amend
git cherry-pick C3git tag
git tag为提交记录打上标签它可以像分支一样引用但不会像分支一样移动。
git tag V1git tag V2 C0git describe
git describe查找离指定引用最近的标签。 git describe ref输出格式tag_numCommits_ghash。
高级话题
多次 rebase git checkout another
git rebase side
git rebase bugFix
git rebase main
git branch -f main another相对引用^中选择 parent 提交记录
相对引用^可以像~一样在后面加个数字该数字是选择第几个 parent 提交记录。
git checkout main^2^和~的链式操作;
git checkout HEAD~^2~2纠缠不清的分支 git checkout one
git cherrt-pick C4 C3 C2
git checkout two
git cherrt-pick C5 C4 C3 C2
git branch -f three C2远程篇
Git 远程仓库基本操作
git clone
git clone 远程仓库URL远程仓库实际上就是你的本地仓库在另一台电脑上的拷贝。
git clone从远程仓库克隆一个副本到本地。 远程分支
上一节中的克隆产生的o/main分支就是远程分支o是远程仓库名。你使用git clone克隆完一个仓库时已经将远程仓库名设置为origin了。
查看远程仓库信息
git remote -v修改远程仓库名
git remote rename 远程仓库名远程分支反映了远程仓库的状态。
切换到远程分支会自动切换到 HEAD 分离状态。
git checkout o/maingit fetch
git fetch 远程仓库URLgit fetch从远程仓库下载缺失的提交记录并更新远程分支指针。实际上就是更新远程分支。
但是git fetch不会改变你的本地分支状态也就是不会改变你的本地仓库文件。 git fecth
git pull
使用git fetch只更新了远程分支并未更新本地分支还需要我们进行进一步合并使用下面方法之一
git cherry-pick origin/maingit merge origin/maingit rebase origin/main
不过Git 的 git pull 命令将拉取和合并操作结合在了一起。 git pull是git fetch和git merge的结合。
git push
git push 不带任何参数时的行为与 Git 的一个名为 push.default 的配置有关。
查看 push.default 值。
git config --get push.defaultpush.default 通常具有以下几种值
simple这是Git 2.0及以后版本的默认值。它会将当前分支的push操作限制为其上游通常是origin远程仓库的同名分支。current这也是一个常见的值它将push操作限制为当前分支。nothing这个选项会禁用默认的push行为您需要明确指定要push 的分支和远程仓库。matching在Git 1.x版本中的默认行为它会将本地的所有分支与远程仓库的同名分支进行匹配然后将它们都 push 到远程仓库。
修改 push.default
git config push.default new_value偏离的提交历史
当你使用 git push 推送代码时会遇到无法推送要先与远程仓库合并的提示。这是由于远程仓库已经被你的同事修改了你调用 API 可能已经不存在或改名了也就是发生了冲突。 如何解决冲突
①使用 git rebase
git fetch
git rebase o/main
git push o main②使用 git merge
git fetch
git merge o/main
git push o main使用 git merge 会多一个合并提交。
当然 git fetch 和 git merge 可以合并为 git pull。
③使用 git pull --rebase即 git fetch 与 git rebase 的结合
git pull --rebase
git push锁定的 main
Git 锁定 main 分支是防止主分支遭到未经审核的修改。
如果你直接提交到 main然后 push不仅会被拒绝还会无法再次推送。
你需要 reset main 分支到远程分支处与远程服务器保持一致。然后新建一个 feature 分支推送 feature 分支到服务器。
Git 远程仓库高级操作
推送主分支
合并远程仓库
远程追踪
git push 的参数
git push 的参数 2
git fetch 的参数
没有 source 的 source
git pull 的参数