git checkout
用法1:切换到目标分支
git checkout <目标分支>
用法2: 复制文件到另一个分支
使用 git checkout 从源分支获取指定文件**:
假设要将 <源分支> 中的文件 example.txt 获取到当前分支,可以使用:
git checkout <源分支> -- <文件路径>
例如:
git checkout feature-branch -- example.txt
检查更改并提交:
此时,example.txt 的更改会被应用到当前分支,您可以检查并提交:
git add example.txt
git commit -m "Merge file changes from feature-branch"
git diff
用法1:复制差异到应用到另一个分支
使用 git diff 和 patch:
如果要更精确地控制文件的更改,可以使用 git diff 创建补丁并将其应用到另一个分支。
步骤:
-
生成补丁:
git diff <源分支> <目标分支> -- <文件路径> > change.patch -
应用补丁:
git apply change.patch -
提交更改:
git add <文件路径> git commit -m "Applied patch from <源分支>"
git stash
存储:
git stash :将所有未提交的修改(工作区和暂存区)保存至堆栈区中,用于后续恢复当前工作目录。
git stash save "message": 同上,只是添加备注方便查找。
查看:
git stash list:查看堆栈区有那些存储。
git stash show [stash@{$num}]:显示大致改动,默认show第一个存储。
git stash show [stash@{$num}] -p:显示细节改动,默认show第一个存储。
删除:
git stash apply [stash@{$num}]:应用某个存储,但不会把存储从堆栈区中删除。
git stash pop [stash@{$num}]:应用某个存储,会把存储从堆栈区中删除。
git stash drop stash@{$num}:把存储从堆栈区中删除。
git stash clear:清空堆栈区。
git rebase
三种用法
第一种
git rebase (source branch) [target branch] :从源分支上修改当前分支或目标分支的基。
第二种
git rebase -i (startCommitId) 或 git rebase -i HEAD~{number} 或 git rebase -i (startCommitId) (endCommitId):合并多次提交记录。
这个过程中,如果不出现意外会存在两个状态:
1)选择合并内容,需要选择对每一次提交进行操作处理,总结如下:
- pick:保留该commit(缩写:p)
- reword:保留该commit,但我需要修改该commit的注释(缩写:r)
- edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
- squash:将该commit和前一个commit合并(缩写:s)
- fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
- exec:执行shell命令(缩写:x)
- drop:我要丢弃该commit(缩写:d) 2)选择或者设置commit Message,对消息进行修改后,直接保持并退出,合并提交记录完成
第三种 (建议使用git cherry-pick命令)
git rebase (startCommitId) (endCommitId) --onto [target branch]:将当前分支的某几个提交记录变基到其它分支上。
变基后,target branch分支的HEAD处于游离状态,需要指定其HEAD到新的变基
git checkout (target branch)
git reset --hard (endCommitId')
冲突解决
在rebase的过程中可能你之后的修改与之前的变基内容有冲突,这个时候,需要进行手动修改冲突。
git add .
git rebase --continue
git rebase --continue :解决冲突后,继续变基操作
git rebase --skip :丢弃掉冲突,以最新的为主
git rebase --abort :终止变基操作
git rebase --quit :发生代码冲突后,退出 Cherry pick
git rebase --edit-todo :
git cherry-pick
使用git cherry-pick命令的作用,就是将指定的提交(commit)应用于其他分支。
三种用法
第一种
git cherry-pick (commitHash) : 从任何分支的commitId处合并到当前分支
第二种
git cherry-pick (source branch) :从源分支的最新提交处合并到当前分支
第三种
git cherry-pick (commitHash) (commitHash) :应用多个提交到当前分支
git cherry-pick (commitHashStart)..(commitHashEnd) :应用commitHashStart之后至commitHashEnd之间所有提交到当前分支(注意此处不包含commitHashStart)
git cherry-pick (commitHashStart)^..(commitHashEnd):应用commitHashStart至commitHashEnd之间所有提交到当前分支
代码冲突
git cherry-pick --continue :用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .),第二步使用下面的命令,让 Cherry pick 过程继续执行
git cherry-pick --abort : 终止cherry-pick过程
git cherry-pick --quit : 发生代码冲突后,退出 Cherry pick
额外参数
git cherry-pick -e : 打开外部编辑器,编辑提交信息
git cherry-pick -n : 只更新工作区和暂存区,不产生新的提交
git cherry-pick -x : 添加备注信息,方便区分
git cherry-pick -s : 添加作者签名,方便接盘
git cherry-pick -m (number) : cherry-pick的节点是一个合并节点时会报错,指定cherry-pick的合并节点源;一般来说,1号是合并后接受变动的分支,2号是合并变动中的来源分支。
git cherry-pick -m 1 <commitHash> // Cherry pick 采用提交来自合并中变动的分支的commitHash
git log 与 git reflog的区别
git log 命令可以显示所有确认提交过的版本信息(不包含删除记录),git log --oneline可以简短的显示提交记录。
git reflog命令可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)。我们可以通过git reflog找到特殊处理(删除或reset或rebase)的commitid,来找到历史版本。
git tag
查看tag
查看本地tag
使用 git tag 命令查看本地仓库的所有标签
查看本地最新的tag
git describe --tags $(git rev-list --tags --max-count=1)
查看远端tag
更新到本地后再查看
第一种方法
git pull 命令默认会更新你的本地分支到远程分支的最新状态,但它不会自动更新本地仓库的标签信息。
如果你想在执行 git pull 的同时更新标签信息,可以使用以下命令:
git pull --tags
git tag
然后使用 git tag 命令查看本地仓库的所有标签。
这样会在拉取最新的代码的同时,也会获取远程仓库的标签信息并更新到本地。
第二种方法
你可以先使用 git fetch --tags origin 命令将远程仓库的标签信息更新到本地,
然后使用 git tag 命令查看本地仓库的所有标签。
git fetch --tags origin
git tag
本地查看最新tag:
git describe --tags $(git rev-list --tags --max-count=1)
这样做可以确保你能够看到完整的远程仓库标签列表,并且在本地仓库中进行操作。
直接查看远端
查看远端tag:
git ls-remote --tags <remote_repository_URL>
// 可以直接使用:
git ls-remote --tags origin
查看远端最新tag:
如果你想要查看远程仓库的最新标签版本,你可以使用以下命令:
git describe --tags origin $(git rev-list --tags --max-count=1)
或者
git ls-remote --tags origin | awk '{print $2}' | cut -d '/' -f 3 | sort -V | tail -n 1
这个命令会列出远程仓库的所有标签,并找到最新的版本。
拉取指定tag代码
当你通过标签(tag)切换到代码时,你不需要考虑当前位于哪个分支。 标签可以视为代码库中的特定快照,与分支无关。 因此,无论当前位于哪个分支,切换到标签都会将代码库的状态设置为该标签所对应的快照状态。
当前本地分支版本切换到本地tag
git checkout <tag_name>
以本地tag创建本地分支
git checkout -b <branch_name> <tag_name>
比如 git checkout -b /dev-3.8 v3.8
以远端tag创建本地分支
git checkout -b <branch_name> refs/tags/<tag_name>
在这个命令中,refs/tags/<tag_name> 指定了标签在 Git 中的引用。通过这种方式,你可以创建一个基于远程仓库的标签的本地分支。
例如,假设你想要基于远程仓库的 v1.0.0 标签创建一个名为 my_new_branch 的新分支,你可以运行以下命令:
git checkout -b my_new_branch refs/tags/v1.0.0
这样就会创建一个名为 my_new_branch 的新分支,并将代码库设置为 v1.0.0 标签所对应的快照状态。
origin/与refs/tags/的区别
如果你使用git checkout -b my_new_branch origin/v1.0.0命令也是可以的。这个命令将会基于远程仓库 origin 的 v1.0.0 标签创建一个新的本地分支 my_new_branch。
实际上,这两种方式都是可以的,但它们略有不同:
-
refs/tags/<tag_name>:这种方式直接指定了标签在 Git 中的引用。它是一个更明确的方法,可以确保你在基于特定标签创建分支时使用的确实是标签。 -
origin/v1.0.0:这种方式是基于远程仓库origin的引用创建分支。在这种情况下,Git 会自动查找远程仓库中名为v1.0.0的引用(包括分支和标签),并将其视为标签。
但是远程仓库中可能存在与标签同名的分支。这种情况下,origin/v1.0.0 引用会被解析为对应的分支而不是标签。
因此,如果你确实想要基于标签创建分支,而不管是否存在同名的分支,最好使用 refs/tags/<tag_name> 形式的引用,以确保你获取的是标签的引用。这样可以避免可能出现的混淆或错误。
新建tag
git tag默认在本地当前分支和当前最新提交创建
如果你想要在指定的提交上创建标签,可以在命令中指定提交的 SHA-1 标识符:
git tag -a <tag_name> -m "Tag description" <commit_hash>
其中:
<tag_name>是你要创建的标签名称。-m "Tag description"用于指定标签的描述信息。<commit_hash>是你要将标签打在其上的提交的哈希值。
这样就会在指定的提交上创建一个名为 <tag_name> 的标签。
一般来说,git add、git commit、git push 和 git tag 这些命令的执行顺序是没有严格限制的,但通常的最佳实践是按照以下顺序执行:
- 执行
git add将文件添加到暂存区。 - 执行
git commit提交文件到本地仓库。 - 执行
git tag <tag_name>创建标签,标记重要的提交或版本。 - 执行
git push将本地提交和标签推送到远程仓库。
这种顺序的好处是,你可以先创建标签,然后再将其推送到远程仓库,确保远程仓库中有与本地相同的标签。
当然,具体情况还是取决于你的工作流程和需求。有些情况下,你可能会先创建标签,然后再提交文件;
而在其他情况下,你可能会先提交文件,然后再创建标签。根据实际情况,可以灵活地调整命令的执行顺序。
删除tag
本地删除标签
git tag -d v1.0.0
删除远程标签
git push origin :refs/tags/v1.0.0
提交tag
默认情况下,git push 命令不会自动推送标签到远程仓库。
提交本地全部tag到远端:
git push origin --tags
提交指定本地tag到远端:
git push origin <tag_name>
如果你的本地分支是第一创建,没有和远端建立关联,并且还要提交tag,可以使用:
git push --set-upstream origin <branch_name> <tag_name>
git取消某个文件监听
使用 git update-index --assume-unchanged jsconfig.json 命令后,Git 将不再追踪 jsconfig.json 文件的变化。这意味着即使文件被修改,Git 也不会将其视为被修改的文件。因此,对 jsconfig.json 文件的后续修改不会被 Git 监听到,除非你取消了对该文件的忽略,使用 git update-index --no-assume-unchanged jsconfig.json。
git 远端
- 添加本地项目的远端仓库地址:git remote add origin git@github.com:newuser/newrepo.git
- 修改本地项目的远端仓库地址:git remote set-url origin git@github.com:newuser/newrepo.git
- 删除本地项目的远端仓库地址:git remote remove origin
- 查看本地项目的远端仓库地址:git remote -v