chenxiaochun/blog

git常用操作总结

chenxiaochun opened this issue · 0 comments

提交文件到本地仓库

先提交文件到本地暂存盘,然后再提交到本地仓库:

git add ./
git commit

或者只需要一条命令直接搞定:

git commit -am [message]

使用-am参数之前,建议一定要使用git status查看一下你当前文件的修改情况,看是不是所有的文件都需要被 commit,养成这个习惯很重要。因为本来分成两步的事情,可以让你在暂存区中进行一下确认。现在没有了这步确认,所以一定要使用git status查看一下。

此外,git add还可以指定参数来应对特定的情况:

  • git add -u,将文件修改和文件删除添加到暂存盘
  • git add .或者git add -A将文件修改、文件新建、文件删除添加到暂存盘
  • git add * -f将对文件的所有操作都添加到暂存盘,包括添加到.gitignore中被忽略的文件

修改最近的一条 commit message

git commit --amend

分支操作

  • 创建并切换到新分支:git checkout -b [name]
  • 拉取远程分支到本地,并创建一个新的分支:git checkout -b 本地分支名 origin/远程分支名
  • 修改分支名称:git branch -m [newName]

查看分支

  • 查看本地分支列表:git branch -l
  • 查看远程分支列表:git branch -r
  • 查看远程分支与本地分支映射关系:git branch -vv
  • 查看各分支最后一次提交信息:git branch -v
  • 查看本地仓库追踪远程仓库的状态:git remote show origin
  • 查看已合并到master分支:git branch --merged
  • 查看未合并到master分支:git branch --no-merged

合并分支

  • 合并一个分支中的一个(或者几个)commit 到另一个分支上:git cherry-pick

删除分支

  • 删除本地分支:git branch -D [branch_name]
  • 删除远程分支:git push origin :[branch_name]git push origin -d <branch-name>
  • 删除所有已合并分支:
git branch -d `git branch --merged`

清理分支

  • 清除所有失效的远程分支或根据提示删除特定失效分支:git remote prune origin
  • 修改分支名称:git branch -m <oldbranch-name> <newbranch-name>

仓库地址查看、修改

修改当前项目的远程仓库地址

  • 直接修改:git remote set-url origin [url]
  • 或者先删除再添加git remote rm origin``git remote add origin [url]
  • 查看当前项目的远程仓库地址:git remote -v

拉取远程文件时,与本地文件发生了冲突:

这种情况一般发生在本地文件已经做了若干修改,但还没有提交到暂存盘。然后我想拉取一下远程仓库最新文件,结果因为某些文件和远程仓库造成冲突而无法拉取成功。这时你可以使用以下操作:

git stash
git pull origin master
git stash apply

第一步是将你修改过的文件先暂时贮藏起来(注意:和上面提到的暂存盘不是一回事儿),第二步是从远程仓库拉取最新的文件到本地,然后第三步是再将刚才贮藏的文件恢复出来。

三步操作完之后,最新文件已经拉取到本地,但是有可能和本地文件依然存在冲突。但此时你只要去解决每个文件的冲突即可。

推送文件到远程仓库时,发生了冲突:

这种情况一般发生在文件已经提交到本地仓库,但是往远程仓库推送时发生了冲突,可以使用以下操作:

git pull origin master --rebase
git push origin master

先将远程操作仓库的提交记录拉到本地进行衍合,然后再次进行提交即可。

文件版本恢复

  • 从暂存盘恢复文件:git reset [fileName]
  • 撤消某一次的commit操作,不会影响在这之前或者之后的commit记录:git revert
  • 从本地仓库恢复文件:git checkout -- [fileName]
  • 从某个分支恢复文件:git checkout [branchName] -- [fileName]
  • 清除本地未被追踪的文件:git clean,加上-df表示同时清除文件和文件夹
  • 强制使用远程文件覆盖本地文件:git reset --hard [origin/branchName]
  • 强制将当前项目推送到远程仓库:git push origin master --force

恢复当前项目到某一历史版本

先通过git log命令获取要恢复到的版本 hash 值,然后再用git reset恢复。--hard参数表示不会保留现在还未 stage 的修改:

git reset [tree-ish] --hard

--soft参数表示会保留还未 stage 的修改:

git reset [tree-ish] --soft

查看修改历史

  • git log,查看提交历史
  • git log --stat,查看每一次的提交都修改了哪些文件
  • git log -p,深入查看每一个文件的修改细节
  • git log --grep [message],过滤查看提交日志
  • git show [tree-ish],查看某一次提交的修改细节
  • git log -- pathname,查看指定目录/文件提交信息
  • git log --graph --decorate --oneline --simplify-by-decoration --all,查看所有分支的切换历史信息
  • git whatchanged,查看每一条提交记录的修改信息
  • git shortlog -sn,列出代码仓库的提交者统计信息
  • git blame [filename],查看某一文件每一行的所有修改历史
  • git blame -L 10,11 README.md,查看指定行数的修改历史

修改文件夹/文件名称操作

git 默认情况下对文件名称是大小写不敏感的,例如,如果想将foo修改为Foo,并期望 git 能够识别出来,需要执行两步操作。首先,执行git mv foo tmp,将foo重命名为一个临时文件名;然后再执行git mv tmp Foo,将其命名为最终文件名即可。

git 子模块操作

  • 克隆主库的时候就要初始化子模块:git clone --recursive [url]
  • 已经克隆了主库,但是还没有初始化子模块:git submodule update --init --recursive
  • 已经克隆了子模块,现在想从源上更新子模块:git submodule update --recursive --remote
  • 向当前库中添加一个新的子模块:git submodule add [url]
  • 更新子模块信息:git submodule update

git 常用设置

  • git config core.ignorecase false,忽略大小写
  • 如果某些文件/文件夹已经提交到了代码仓库,那么后面你再想将某些文件/文件夹添加到.gitignore中之后是不起作用的。解决办法就是在修改完.gitignore之后,执行git rm -rf --cached .命令即可