一、拉取代码让我瞧一瞧
克隆指定分支/版本 (clone/reset/checkout)
git clone <仓库地址>
git clone <仓库地址> <目标文件夹名>
git clone <仓库地址> -b <分支名>
git clone <仓库地址> -b <分支名> <目标文件夹名>
git reset --hard <版本 ID>
git checkout <版本 ID>
更新代码 (pull)
git pull 从远程拉取更新
查看状态/日志 (status/log)
git status
git log
子模块拉取 (submodule)
子模块的信息保存在 .gitmodules 中
git submodule 查看自模块列表
git submodule deinit ??
git submodule init ??
git submodule update --init <子模块名> 初始化子模块
git submodule update <子模块名> 更新子模块
git submodule update --init --recursive 递归地更新所有子模块
Git 中submodule的使用,终于有人说明白了_Java斗帝之路的博客-CSDN博客
代码关键字搜索 (grep)
git grep <关键字>
将远程的变更拉到本地进行查看 (cherry-pick)
假设在某远程分支上有 “版本 1” ~ “版本 10” 共十次 Commit,我们希望把 “版本 5” ~ “版本 10” 的内容拉取到本地查看,可以按下面的步骤做
git checkout <版本 4>
git checkout -b <临时分支名>
git cherry-pick <版本 5>^..<版本 10> --no-commit
git restore --staged .
其中:
- X^..Y 表示从 X 到 Y 之间的所有变更(包含 X 的变更)
- --no-commit 表示置为 Stage (未 Commit) 的状态
- restore --staged . 表示将所有 Stage 的文件变为 Unstage (未 Add) 的状态
二、牛马开始干活
分支操作 (branch)
git branch 查看本地分支
git checkout <分支名> 切换到某分支
git checkout -b <新分支名> 创建并切换到新分支
git branch -d <分支名> 删除分支
git branch -D <分支名> 强制删除分支
经典提交一把梭 (add, commit, push)
git add .
git commit -m "<描述信息>"
git push 推送到远程分支
git push --set-upstream origin <远程分支名> 创建远程分支并推送到该远程分支
删除/重命名文件 (rm/mv)
git rm -f <文件名...>
git mv <源文件> <目标文件>
查看更改内容 (diff)
git diff
git diff <文件名>
补丁导出导入 (diff/apply)
git diff > <补丁名>
git diff <版本ID> > <补丁名> 生成当前和某版本之间差异的补丁
git diff HEAD~1 > <补丁名> 生成当前和上 1 次提交之间差异的补丁
git apply <补丁名> 导入补丁
暂存本地更改 (stash)
当我们创建一个新的分支 dev,并且在新分支上修改了原文件,在我们没有提交到仓库的前提下,将分支再切换到 master 分支上,执行 git status ,可以看到 dev 操作的状态:(1)因为未 add 的内容不属于任何一个分支, 未 commit 的内容也不属于任何一个分支。 也就是说,对于所有分支而言, 工作区和暂存区是公共的。(2)你在 dev 分支修改了文件,但是你没有提交到仓库,实际上就是相当于你在本地手动修改了这个文件仓库并不能保存你做的改动,所以在 master 分支能看到文件被改动了(相当于你没用 dev 分支直接修改了这个文件一样)。
git stash 暂存本地修改
git pull 更新当前分支
git stash list 显示暂存的本地修改列表
git stash pop stash@{0} 还原某个暂存的本地修改
git stash clear 清空所有暂存的本地修改
git stash drop stash@{0} 删除第一个暂存的本地修改
rebase
举个例子,如果从 develop 分支拉取出来一个 feature 分支,在开发 feature 分支的过程中,develop 分支(被别人)发生了修改,这时需要把当前的 feature 分支更新到最新,就需要 rebase
rebase 之后 push 到远程分支:
git checkout master 切回原来的分支,并更新
git pull
git checkout feature 切回刚才正在开发的分支,用 master 分支进行 rebase
git rebase master
git push --force origin feature 推到远程分支,必须加 force,不然会报错
P.S. 如果 rebase 前本地修改还没有 add/commit,则需要先 git stash 暂存本地变更,执行 rebase 之后再通过 git stash pop 恢复本地修改
git rebase详解(图解+最简单示例,一次就懂)_风中一匹狼v的博客-CSDN博客_git rebase
[git] your branch is ahead of ... 解决办法_mandagod的博客-CSDN博客
git rebase后不能push问题 - JadeCicada - 博客园
Git push rejected after feature branch rebase - Stack Overflow
子模块更新 (submodule)
子模块的信息保存在 .gitmodules 中
git submodule update --init <子模块名> 确保子模块已经被拉取下来
cd <子模块目录>
git checkout <子模块版本ID>
cd <根目录>
git add <子模块目录>
git commit -m "<描述信息>"
git push
三、哎呀,我后悔了
丢弃本地修改/恢复文件 (checkout/restore)
相当于丢弃本地更改
git checkout -- <文件名...>
git restore <文件名...>
git checkout <版本ID> -- <文件名>
git restore --source=<版本ID> <文件名>
撤销提交 (reset)
git reset HEAD 撤销add的所有内容
git reset HEAD <文件名...> 撤销add的某个/多个文件
git reset --soft HEAD^ 撤销 commit,回退到上一个版本(多少个 ^ 表示上多少个版本)
git reset --hard <版本ID> 回退到指定版本
Git操作之 git add 撤销、git commit 撤销 - 糖糖H - 博客园
修改 Commit 注释 (commit --amend)
git commit --amend 修改 commit 的注释