git 常用命令
注意:
- 下面出现的
origin
都是代表远程主机名
日常代码提交
- 暂存所有更改
git add .
- 暂存某个文件
git add aaa/bbb.js
- 提交已暂存的文件
git commit -m "注释"
- 推送到远程仓库
git push
日常代码拉取
- 拉取远程代码
git pull
- 把当前的修改隐藏
git stash
- 弹出最新储藏隐藏
git stash pop
- 从远程仓库获取最新代码和分支
git fetch origin
- 查看本地分支和远程分支的差异
git diff master origin/master
- 将远程分支的代码合并到本地分支
git merge origin/master
日常分支使用
- 创建一个叫做 feature_x 的分支,并切换过去:
git checkout -b feature_x
- 切换回主分支:
git checkout master
- 再把新建的分支删掉:
git branch -d feature_x
- 将分支推送到远端仓库:
git push origin <branch>
分支指定 commit 合并
git cherry-pick <commit-hash>
其中<commit-hash>
是要被应用的提交的 SHA-1 值,可以是一个也可以是多个用空格分隔- 查看当前分支的提交历史
git log --oneline
- 选择性地应用这些提交
git cherry-pick a1b2c3 d4e5f6
上述命令将选择性地将 a1b2c3 和 d4e5f6 两个提交应用到当前分支中 - 如果只想选择最近的几个提交进行应用,可以使用
git cherry-pick HEAD~3..HEAD
, 例如,要选择最近的 3 个提交进行应用 - 意有可能出现冲突需要手动解决
日常代码回滚
- 从本地 HEAD 区 获取某个文件替换本地修改
git checkout -- <filename>
- 软回滚
git reset --soft HEAD^
回撤 commit 操作,写的代码仍然保留 - 混合回滚
git reset --mixed HEAD^
回撤 commit, add 操作,写的代码仍然保留 - 强回滚
git reset --hard HEAD^
回撤 commit, add 操作,同时回撤改动的代码 HEAD^
是上一个版本的意思,也可以写成HEAD~1
,进行了 2 次 commit,都想撤回就可以使用HEAD~2
从远程仓库回滚代码到本地/远程代码覆盖本地代码
- 更新本地仓库的所用信息
git fetch --all
- 从远程分支强回滚
git reset --hard origin/master
- 推送到远程分支
git pull origin master
远程仓库代码的回滚
- 方法一:使用 git revert 命令,使用 git revert 命令可以在保留历史记录的同时,将当前提交撤销掉,并创建一个新的提交,将撤销的更改提交到远程仓库
git revert <commit-id>
,<commit-id>
是要撤销的提交的 SHA-1 标识符,
如果要一次性撤销多个提交,可以指定一个范围git revert <start-commit-id>..<end-commit-id>
这里的<start-commit-id>
是要撤销的第一个提交的 SHA-1 标识符,而<end-commit-id>
是要撤销的最后一个提交的 SHA-1 标识符(不包括该提交)。- 方法二:使用 git reset 命令,使用 git reset 命令可以将当前分支的 HEAD 指针移动到以前的提交或重置到一个空的提交。这将删除提交历史记录中指定提交和它之后的所有提交。
- 首先强回滚:
git reset --hard <commit-id>
- 再强推送到远程仓库:
git push --force origin <branch-name>
- 方法二慎重使用,很有可能覆盖其他人的代码!
修改 commit 的信息
- 运行命令
git commit --amend
进入 vim 编辑模式 - 按 i 键进入插入模式
- 修改完按 esc 键退出插入模式
- 输入
:wq
保存并退出,或者输入:wq!
强制保存并退出 - 不保存退出
:q
,不保存强制退出:q!
- 放弃所有修改,重新编辑
:e!
- 如果之前的 commit 已经推送到了远程分支,那么需要使用
git push --force
命令推送修改后的 commit,
因为修改后的 commit hash 值已经改变了,需要强制覆盖已经推送的修改,
需要注意的是,修改了已经推送到远程仓库的提交可能会导致其他人的代码库出现错误,因此仅在使用私有分支时使用该命令
分支
- 查看所有分支
git branch -a
- 新建分支
git branch 分支名
- 切换分支
git checkout 分支名
- 推送分支
git push origin 本地分支名
- 新建分支并切换到新建分支
git checkout -b 分支名
- 根据[远程分支]新建[本地分支],并切换到这个[本地分支]
git checkout -b 本地分支名 origin/远程分支名
- 查看分支的最后一次提交
git branch -v
- 查看本地分支对应的远程分支
git branch -vv
- 查看所有未合并工作的分支
git branch --no-merged
- 查看哪些分支已经合并到当前分支
git branch --merged
- 合并分支
git merge 分支名
- 删除分支
git branch -d 分支名
- 强制删除分支
git branch -D 分支名
- 删除远程分支
git push origin --delete 远程分支名
- 本地分支与远程分支关联
git branch --set-upstream-to=origin/远程分支名 本地分支名
如果当前位于该分支,则可以省略分支名称:git branch --set-upstream-to=origin/远程分支名
,
或可以使用-u
选项将本地分支与远程分支关联:git branch -u origin/远程分支名 本地分支名
拉取
- 拉取远程代码到本地并合并
git pull
,
git pull
其实就是git fetch
和git merge FETCH_HEAD
的简写 git pull origin master:localBranch
将远程主机 origin 的 master 分支拉取过来,与本地的 localBranch 分支合并,
如果远程分支是与当前分支合并,则冒号后面的部分可以省略git pull origin master
推送
- 本地代码推送到远程并合并
git push
git push 远程主机名 本地分支名:远程分支名
,
如果本地分支名与远程分支名相同,则可以省略:远程分支名
写成git push 远程主机名 本地分支名
git push --force origin master
如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数git push origin --delete master
删除主机的分支可以使用 --delete 参数,此命令表示删除 origin 主机的 master 分支
更改
- 更改:就是未被
git add
也未被git commit
的修改 git checkout
查看有哪些更改git add .
暂存所有更改git reset HEAD .
取消所有更改git checkout .
放弃所有更改- 取消某个文件更改
git reset HEAD 文件路径
例如:git reset HEAD src/views/index.vue
- 放弃某个文件更改
git checkout 文件路径
例如:git checkout src/views/index.vue
变基/rebase
- Git 中的变基(rebase)是一个将一个分支上的提交应用到另一个分支上的操作。
- 它与合并(merge)不同,合并是将两个分支的更改内容合并为一个新的提交,
- 而变基则是将当前分支的更改内容应用到另一个分支上,从而使得分支的提交历史形成一条直线。
- 使用
git rebase
可以将当前分支上的提交历史放置在指定分支(通常为主干分支)的最新提交后面。这可以使得历史记录更加清晰,同时也可以减少合并分支时可能出现的冲突。
rebase 用法
- 切换到需要进行变基的分支上
git checkout feature
- 进行变基
git rebase master
- 在执行该命令之后,Git 会将
feature
分支的基础更改为指定分支master
,然后将当前分支的更改应用到指定分支上,并形成一条新的提交历史。 - 如果需要,可以执行
git checkout
命令切换到目标分支,并使用git merge
将变基后的分支合并到目标分支上,以完成变基操作。 - 注意,变基可能会产生冲突,需要手动解决冲突后再继续进行变基操作。
rebase 总结
- 变基是 Git 中一个强大的工具,可以使分支的提交历史变得更加清晰,同时也可以减少合并分支时可能出现的冲突。
- 但是,在使用变基时需要小心处理,避免对代码库造成不可逆的影响。
- 因此,建议在进行变基操作前先备份代码或者创建并切换到新的分支上进行操作。
标签/tag
- 在 Git 中,一个 tag 就是一个指向一个 Git 对象的指针,通常是一个 commit 对象。
- tag 可以用来标记一些重要的或有意义的提交,例如发布版本号、里程碑版本等。
- tag 可以让开发者快速定位到特定的提交,以便处理问题、修复错误或回退到旧版本等。
tag 用法
- 创建 tag
git tag v1.0
创建一个名为v1.0
的 tag - 默认情况下,tag 创建在当前分支的最新 commit 上。
如果需要指定 commit,可以使用-a
参数创建一个附注 tag,并使用-m
参数添加 tag 的说明信息:
git tag -a v1.0 -m "Release version 1.0" <commit-hash>
- 列出 tag
git tag
- 查看 tag
git show v1.0
- 推送 tag
git push origin v1.0
- 一次性推送所有 tag
git push --tags
- 删除 tag
git tag -d v1.0
- 删除远程 tag
git push origin --delete v1.0
存储
git stash
储藏:把当前的修改存储并隐藏起来, 此时git status
的结果是 clean。
可以通过使用git stash save "注释"
可以添加一些注释git stash list
查看所有 stash(储藏)git stash show
显示最新储藏的内容具体是什么git stash show stash@{指定储藏的id}
显示指定储藏的内容具体是什么,使用方法如git stash show stash@{0}
git stash apply
应用最新储藏git stash apply stash@{指定储藏的id}
应用指定储藏,使用方法如git stash apply stash@{0}
git stash pop
弹出最新储藏git stash pop stash@{指定储藏的id}
弹出指定储藏,使用方法如git stash pop stash@{0}
git stash drop
删除最新储藏git stash drop stash@{指定储藏的id}
删除指定储藏,使用方法如git stash pop stash@{0}
git stash clear
删除所有的储藏git stash pop
命令会在 stash 应用之后丢弃(默认情况下指的是最顶部的)stash,
而git stash apply
会将其保留在存储列表中,以备日后重用(或者您可以在之后使用git stash drop
命令移除此 stash)。
除非git stash pop
之后存在冲突,在这种情况下,它将不会删除该 stash,
而使其行为与git stash apply
的命令完全相同。
当然,我们也可以使用另一种方式来实现git stash pop
,那就是:git stash apply && git stash drop