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