git 使用笔记 (不定期更新中)
目录
子模块 (Submodule)
添加
git submodule add [remotegiturl] [localdir]
更新
git submodule update --init --recursive
clone 时更新子模块
git clone [remotegiturl] --resuresive
远程更新(更新到最新)
submodule 不会detach到源的任何一个分支,而只是源的某一个commit,
使用 git submodule update --remote
将本地的子模块更新到最新。如果需要将远程仓库的子模块了更新到最新,可以先更新本地,再push到远程仓库:
1 2 3 |
git add . git commit -m "submodule update" git push |
删除
git 没有提供删除子模块的命令
分支(branch)
git 仓库在创建的时候默认会创建一个 master 分支
创建分支
git branch [branch_name]
会创建一个新的分支。此时仍然工作在原分支上,而不会自动切换到新创建的分支上。git 对分支的名称有一些限制:
- 可以包含斜杠(/),但不能以斜杠(/) 开头或结尾
- 不能以点号(.), 减号(-) 开头, 点号也不能紧跟在斜杠后面,并且不能出现连接的两个点号。如 feature/.new ,feature..new 都是非法的
- 不能包含任何空白字符(如空格,tab)
- 不能包含在 git 中具有特殊意义的字符。包括
~, ^ , : , ? , * , [
- 不能包含任何 ASCII控制字符,即值小于八进制 \040 的字符或 DEL(八进制\177)
查看分支
git branch
当后面不跟任何参数时,显示本地所有的分支,并对当前分支做特殊标识。git branch -r
会查看远程分支git branch -a
会将本地分支和远程分支都列出来git show-branch
另一个命令可以查看更详细的内容:输出分为两个部分,使用减号分隔。
减号的个数是同分支的个数决定的,有多少个分支就有多少个 '-' 。
上半部分显示所的有分支。当前分支使用 '*',其他分支分别使用不同颜色的 '!' 标识。颜色没有特殊的意义,只是用来区分不同的分支而已;
下半部分显示 commit 列表。每个列表使用 '*' 和不同颜色的 '+' 表示。这里的颜色和上半部分 '!' 相对应,表示该分支上有此 commit
切换分支
git checkout [branch_name]
切换到指定的分支。可以将创建分支与切换分支合并为一个命令:git checkout -b [branch_name]
命令会创建一个新分支并自动切换到新创建的分支上。
删除分支
git branch -d [branch_name]
可以删除指定的分支。注意如果删除的是当前工作分支则会失败,需要先切换出其他分支才能删除当前分支。master分支也是可以删除的,只是不建议这么做。
合并分支
先切换到目标分支,使用
git merge [branch_name]
可以将分支合并到当前分支
冲突
如下情形表示 git pull 出现冲突了:
1 2 3 |
error: Your local changes to 'xxx.c' would be overwritten by merge. Aborting. Please, commit your changes or stash them before you can merge. |
一般的解决方法是先将本地修改 stash
(隐藏) 起来,待 pull 成功后再取出修改,手动编辑解决冲突;
1 2 3 4 5 6 7 |
$ git stash #存储本地修改 $ git stash list #查看本地修改: stash@{0}: WIP on master: 353a4d9 fix $ git pull $ git stash pop stash@{0} #取出存储的修改,并合并,然后手动解决冲突 Auto-merging CMakeLists.txt CONFLICT (content): Merge conflict in CMakeLists.txt |
git 会将冲突使用特殊符号标出,像这样:
1 2 3 4 5 |
<<<<<<< Updated upstream add_executable(rsa test_rsa.cpp) ======= add_executable(aes_rsa test_rsa.cpp) >>>>>>> Stashed changes |
其中Updated upstream 和=====之间的内容就是pull下来的内容,====和stashed changes之间的内容就是本地修改的内容。git 没有智能到可以识别哪些是你想要的,需要自己决定删除哪些保留哪些内容。
修改之后及时提交,并 pull。
其它
Windows 下修改文件名大小写
如将 bg.JPG
修改为 bg.jpg
,此修改在 windows 下是无法被检测到的,因为 Windows 操作系统是大小写不敏感的。此时需要使用 mv
命令:
git mv -f bg.JPG bg.jpg
本地仓库向添加远程地址并提交
1 2 |
git remote add origin git@github.com:xxx.git git push -u origin master |
仓库更改远程地址
1 |
git remote set-utl git@xxxx.git |