git 常见问题
1. 撤回 commit
撤回 commit 使用到 git reset 指令
一般我们在使用 reset 命令时,git reset --hard 会被提及的比较多,它能让 commit 记录强制回溯到某一个节点。而 git reset --soft 的作用正如其名,--soft (柔软的) 除了回溯节点外,还会保留节点的修改内容。
# 恢复最近一次 commit
git reset --soft HEAD^
git reset --soft <commitId>
以上说的是还未 push 的commit。对于已经 push 的 commit,也可以使用该命令,不过再次 push 时,由于远程分支和本地分支有差异,需要强制推送 git push -f 来覆盖被 reset 的 commit。
2. 修改 commit
- 刚刚commit,还没有push,使用
git commit --amend,这个命令会合并提交到上一次的commit里 zhuanlan.zhihu.com/p/100243017 - 对于已经 push 到远程仓库的,需要使用 git rebase -i 交互式变基
# 基于 commitId 进行 rebase
git rebase -i <commitId>
# 如果要修改第一次commit信息,则执行
git rebase -i --root
具体步骤如下:
- git rebase -i [ | --root]
- 键入 i 进入输入模式
- 可用键盘上下键转到描述所在的那一行
- 将要修改的那一条commit的 pick 改为 edit
- 按下 Esc键退出编辑模式
- 再键入 :wq 回车退出
- 执行git commit --amend,修改commit信息
- 执行git rebase --continue 结束rebase
- git push -f,强制push上去
3. 本地分支和远程分支关联
首先可以通过 git branch -vv 查看本地分支及追踪的分支
- 在创建本地分支的时候就关联远程分支:
git checkout -b dev origin/dev git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]git branch [--set-upstream | --track | --no-track] <branchname>- 如果分支只有本地有,远程仓库没有,可以使用这个:
git push [-u | --set-upstream] <remoteName> <branchName>,会在远程仓库新建一个分支并和本地分支关联
4. 设置别名
- 设置
git config --global alias.pr "pull --rebase"
- 查看
git config --get-regexp alias
- 删除
git config --global --unset alias.pr
git 常用指令
git remote
# 查看连接的远程仓库地址
git remote -v
# 添加远程地址
git remote add origin <url>
# 修改远程地址
git remote set-url origin <newUrl>
# 删除远程仓库连接
git remote rm origin
# 查看远程仓库的分支
git remote show origin
# 本地删除远程不存在的分支
git remote prune origin
git branch
# 切换分支
git checkout <branchName>
# 新建分支并切换到该分支
git checkout -b <branchName>
# 创建且切换到本地分支,并和远程分支关联
git checkout -b dev origin/dev
# 查看本地分支及追踪的分支
git branch -vv
# 关联远程分支
git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
git branch [--set-upstream | --track | --no-track] <branchname>
# 重命名分支
git branch (-m | -M) <oldbranch> <newbranch>
# 删除分支 -d => --delete, -D => --delete --force
git branch (-d | -D) <branchName>
# 将dev合并到当前分支
git merge dev
# 将当前分支的base分支变成dev
git rebase dev
git tag
# 新建标签
git tag [tagName]
# 查看标签列表
git tag
# 删除标签
git tag -d [tagName]
# 推送标签到远程仓库
git push origin [tagName]
git commit
# 将暂存区文件添加到本地仓库,并记录下备注
git commit -m 'xxx'
# 跳过 husky hooks 设置的规则校验
git commit -m 'xxx' -n
# 将文件添加到暂存区,再添加到本地仓库,并记录下备注 = git add + git commit
git commit -am 'xxx'
# 修改commit信息
git commit --amend
zhuanlan.zhihu.com/p/100243017
git push
# git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run]
# [--receive-pack=<git-receive-pack>] [--repo=<repository>] [-f | --force]
# [-d | --delete] [--prune] [-v | --verbose] [-u | --set-upstream]
# [--push-option=<string>] [--[no-]signed|--sign=(true|false|if-asked)]
# [--force-with-lease[=<refname>[:<expect>]]]
# [--no-verify] [<repository> [<refspec>…]]
# 推送分支
git push <remoteName> <branchName>
# 推送分支并建立关联关系
git push [-u | --set-upstream] <remoteName> <branchName>
# 删除远程分支
git push [-d | --delete] <remoteName> <branchName>
git pull
# 从远程仓库拉取代码合并到本地,等同于 git fetch && git merge
git pull
# 使用rebase的模式进行合并
git pull --rebase
git merge
# 将其他分支的内容合并到当前分支中
git merge <branchName>
git rebase
# 将当前分支变基到 master 分支上
git rebase master
git reset
# 回退所有内容到上一个版本
git reset HEAD^
# 回退某文件到上一个版本
git reset HEAD^ [filename]
# 回退所有内容到指定版本
git reset [commitId]
# 回退本地仓库到上一个版本
git reset --soft HEAD~1
# 回退本地仓库到上一个版本,并删除工作区所有未提交的修改内容
git reset --hard HEAD~1
git stash
# 暂存文件
git stash
# 暂存文件,添加备注
git stash save 'aa'
# 应用最近一次暂存文件,并删除暂存记录
git stash pop
# 应用最近一次暂存,但不删除该暂存记录
git stash apply
# 应用某一次暂存,但不删除该暂存记录;
git stash apply stash@{第几次暂存的代码,例如0}
# 暂存记录
git stash list
# 删除所有暂存记录
git stash clear
git flow
git flow init
# Branch name for production releases: [master]
# Branch name for "next release" development: [develop]
# How to name your supporting branch prefixes?
# Feature branches? [feature/]
# Bugfix branches? [bugfix/]
# Release branches? [release/]
# Hotfix branches? [hotfix/]
# Support branches? [support/]
# Version tag prefix? []
# 基于你本地的develop分支创建功能分支feature/baseinfo并切换过去
git flow feature start baseinfo
# =========上面指令等价于===========
# git checkout -b feature/baseinfo develop
# ==================================
# 若需要将feature分支发送到远程仓库,可以使用如下指令
git flow feature publish baseinfo
# =========上面指令等价于===========
# git checkout feature/baseinfo
# git push origin feature/baseinfo
# ==================================