git常用命令的简单总结

370 阅读6分钟

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 diffpatch:

如果要更精确地控制文件的更改,可以使用 git diff 创建补丁并将其应用到另一个分支。

步骤:

  1. 生成补丁

    git diff <源分支> <目标分支> -- <文件路径> > change.patch
    
  2. 应用补丁

    git apply change.patch
    
  3. 提交更改

    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命令也是可以的。这个命令将会基于远程仓库 originv1.0.0 标签创建一个新的本地分支 my_new_branch

实际上,这两种方式都是可以的,但它们略有不同:

  1. refs/tags/<tag_name>:这种方式直接指定了标签在 Git 中的引用。它是一个更明确的方法,可以确保你在基于特定标签创建分支时使用的确实是标签。

  2. 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 addgit commitgit pushgit tag 这些命令的执行顺序是没有严格限制的,但通常的最佳实践是按照以下顺序执行:

  1. 执行 git add 将文件添加到暂存区。
  2. 执行 git commit 提交文件到本地仓库。
  3. 执行 git tag <tag_name> 创建标签,标记重要的提交或版本。
  4. 执行 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