目录
No submodule mapping found in .gitmodule
设置相关
设置用户名和邮箱
为所有项目设置默认的用户名和邮箱
git config --global user.name"xxxxxx"
git config --global user.email"xxxxx@163.com"
不同的项目设置不同的用户名和邮箱
- 进入项目文件夹
执行下面的命令
git config user.name "xxxx"
git config user.email "xxxx@163.com"
历史版本相关
回滚到任意历史版本
- 查找需要回滚版本的哈希值,例如e377f60e28c8b84158;
- 回滚到指定版本,git reset --hard e377f60e28c8b84158
从指定历史版本拉取新分支
- 查找需要创建新分支的版本的哈希值,例如e377f60e28c8b84158;
- 创新新分支,git checkout -b 新分支名 e377f60e28c8b84158
获取指定的历史版本代码
- 查找需要获取代码的历史版本的哈希值,例如e377f60e28c8b84158;
- 获取代码,git checkout e377f60e28c8b84158
补丁相关
补丁生成
当前分支所有超前master的提交:git format-patch -M master
某次提交以后的所有patch:git format-patch 4e16 --4e16指的是commit名
从根到指定提交的所有patch:git format-patch --root 4e16
某两次提交之间的所有patch:git format-patch 365a..4e16 --365a和4e16分别对应两次提交的名称
某次提交(含)之前的几次提交:git format-patch –n 07fe --n指patch数,07fe对应提交的名称
单次提交为:git format-patch -1 07fe
git format-patch生成的补丁文件默认从1开始顺序编号,并使用对应提交信息中的第一行作为文件名。如果使用了-- numbered-files选项,则文件名只有编号,不包含提交信息;如果指定了--stdout选项,可指定输出位置,如当所有patch输出到一个文件;可指定-o <dir>指定patch的存放目录;
应用补丁
1、先检查patch文件:git apply --stat newpatch.patch
2、检查能否应用成功:git apply --check newpatch.patch
3、打补丁:git am --signoff < newpatch.patch (使用-s或--signoff选项,可以commit信息中加入Signed-off-by信息)
注意事项
1、在使用git am之前, 你要首先git am --abort 一次,来放弃掉以前的am信息,这样才可以进行一次全新的am,不然会遇到如下错误:
.git/rebase-apply still exists but mbox given.
2、git am 可以一次合并一个目录下所有的patch,例如:
git am somedir/*.patch
分支相关
重命名本地分支
git branch -m old_branch_name new_branch_name
跟踪远程分支
例如想要跟踪远程的serverfix分支,可使用如下命令
git checkout --track origin/serverfix
如果想要将本地分支与远程分支设置为不同名字(如sb),可将上述命令改为
git checkout -b sf origin/serverfix
删除远程分支
git push origin --delete remote_branch
重命名远程分支
- 删除远程分支:git push origin :remote_branch_name
- 将本地分支推送到远程分支上,如果远程分支不存在,则创建此远程分支:git push origin local_branch_name:remote_branch_name
推送本地分支到远程仓库
git push origin branch_local
合并指定commits到另一个分支
git checkout dst_branch_name
git cherry-pick commit_id
例如:
git checkout master
git cherry-pick 62ecb3
从远程仓库获取最新代码合并到本地分支
git merge origin/branch_name
从指定提交创建分支
方法一
git checkout -b branch_name commit_id
方法二
1、确定需要取出版本的commit值
2、基于该commit创建分支
git branch branch_name commit_id
3、切换到该分支
git checkout branch_name
撤销相关
撤销当前目录下工作区所有修改
撤销当前目录下没有add的修改
git checkout .
撤销暂存区所有修改
git reset
撤销已经推送到远程的修改
步骤一:使用“git reset --hard 版本号”在本地回退到相应的版本;
步骤二:使用“git push origin <分支名> --force”覆盖相应的分支。
日志相关
查看最近几条提交记录的日志
git log -2 //查看最近的2条提交的日志记录
查找包含关键字的日志记录
git log --grep xxx
子模块相关
初始化子模块
git submodule init
克隆项目时自动初始化并更新仓库中的每一个子模块
git clone --recursive https://xxx
更新子模块
方法一
进入子模块目录,运行git fetch和git merge目录,例如:
方法二
在父项目目录执行git submodule update --remote xxx,默认检出子模块仓库的master分支,例如:
如果想检出master分支以外的分支,可以使用一下命令
git config -f .gitmodules submodule.XXX.branch stable
以上目录将XXX子模块跟踪仓库的“stable” 分支。
如果不用- f .gitmodules选项,那么它只会为你做修改。但是在仓库中保留跟踪信息更有意义一些,因为其他人也可以得到同样的效果。
添加子模块
git submodule add https://xxx/otherprj [path]
如果不带path则子模块会将子项目放到一个与仓库同名的目录。
删除子模块
Git中目前尚无直接删除子模块的命令,但可以通过以下步骤删除:
- 从.gitmodules文件中删除相关部分;
- 保存.gitmodules更改:git add .gitmodules;
- 从.git / config中删除相关部分;
- 从工作树和索引中删除子模块文件:git rm --cached path_to_submodule (结尾没有斜杠);
- 删除子模块的.git目录:rm -rf .git/modules/path_to_submodule;
- 提交更改:git commit -m "Removed submodule <name>";
- 删除现在未跟踪的子模块文件:rm -rf path_to_submodule。
标签相关
创建轻量标签
git tag tag_name [commit ID]
例如:
git tag v1.4 在当前提交创建轻量标签
git tag v1.4 abcd 在Commit ID以abcd开头的提交创建轻量标签
创建附注标签
git tag -a tag_name -m tag_message
例如,git tag -a v1.4 -m 'my version 1.4'
-m 选项指定了一条将会存储在标签中的信息。
在之前的提交上打标签
git tag -a tag_name commit_id
例如,git tag -a v1.2 9fceb02
推送单个标签
git push origin tag_name
推送多个标签
使用带有--tags 选项的git push命令。 这将会把所有不在远程仓库服务器上的标签全部传送到那里。
删除远程标签
git tag -d tag_name
git push origin :refs/tags/tag_name
重命名标签
git tag new_tag old_tag
git tag -d old_tag
git push origin :refs/tags/old_tag
git push --tags
列出所有标签
git tag
查找标签
git tag -l 'v1.8.5*'
查看标签对应的提交信息
git show v1.4
想要工作目录与仓库中特定的标签版本完全一样
git checkout -b branch_name tag_name
例如:git checkout -b version2 v2.0.0
问题解决
No submodule mapping found in .gitmodule
描述:有时候.gitmodule有对应的子模块的条目,但在执行git submodule update --init时仍然会报类似No submodule mapping found in .gitmodules for path 'XXX/YYY'的错误信息
解决:将.gitmodules文件中对应模块条目的path中的反斜杠改为斜杠。
示例:"path = thirdsrc\boost" 改为 "path = thirdsrc/boost"
暂存
保存本地修改
//保存本地修改
git stash
//本地修改并附加消息
git stash save "message"
恢复暂存的修改
//恢复暂存修改到本地,同时从暂存栈中删除最近的暂存
git stash pop
//恢复最近暂存的修改到本地,但不从暂存栈中删除最近的暂存
git stash apply
//恢复指定暂存的修改到本地,但不从暂存栈中删除该暂存
git stash apply stash@{xxx}
删除暂存的修改
//清除所有暂存的修改
git stash clear
//删除指定暂存的修改
git stash drop stash@{xxx}
查看所有暂存的修改
git stash list
查看暂存修改的内容
可以使用git stash show命令,后面可以跟着stash名字。示例如下:
$ git stash show
index.html | 1 +
style.css | 3 +++
2 files changed, 4 insertions(+)
在该命令后面添加-p或--patch可以查看特定stash的全部diff,如下:
$ git stash show -p
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* {
+ text-decoration: blink;
+}
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+<link rel="stylesheet" href="style.css"/>
其他
修改默认编辑器
方法一:git config --global core.editor vim
方法二:打开.git/config文件,在core中添加 editor=vim即可
参考文章
《Pro Git Second Edition》
git pull和git merge区别&&Git冲突:commit your changes or stash them before you can merge. 解决办法
No submodule mapping found in .gitmodule for a path that's not a submodule