在现有目录中初始化仓库
1 | git init |
执行后,会创建一个.git文件夹
1 | ➜ gitdemoprj git init |
目前默认创建的分支名是main,不是master了。不注意的话后续一些操作比如push等等可能会出错。如果git init时不想使用默认的main分支名怎么办呢?
方法1:在初始化的时候指定分支名
1 | git init -b master //这里指定为master。 |
方法2:全局设置初始化的分支名称。
1 | git config --global init.defaultBranch <name> |
该命令会在~/.gitconfig文件里添加配置:
1 | [init] |
以后使用git init初始化后默认的就都是master了。
可是我现在已经是main分支了,想修改为master怎么办呢?那只能采用修改分支名的方法嘞。
ps:这个时候查看分支git branch是不会显示任何分支的。因为git的分支必须指向一个commit,没有任何commit就没有任何分支,提交第一个commit后git自动创建master分支。
继续提交操作:
1 | git add . |
查看分支
1 | git branch //查看本地所有分支 |
如果是远程分支则前面会有remotes/
修改分支名
假设该分支还没有推送到远程,可以使用下面的命令:
1 | git branch -m <name> |
git 中一些选项解释
1 | -d --delete:删除 |
添加远程仓库
如果想多人协作,那么就需要给本地仓库添加一个远程仓库。
1 | git remote add <shortname> <url> |
shortname就代表url相当于起个名字,方便后续操作。当然如果你不嫌麻烦直接用url也是可以的,有时候也确实会直接用url。
查看远程仓库
1 | git remote |
示例:
1 | ➜ gitdemoprj git:(master) git remote |
推送到远程仓库
git push 命令用于将本地的分支版本上传到远程并合并。
1 | git push <远程主机名> <本地分支名>:<远程分支名> |
从这个语法可以知道可以将本地分支推送到远程的别的分支上去,如果远程分支不存在则会自动创建。
如果本地分支名与远程分支名相同,则可以省略冒号:
1 | git push <远程主机名> <本地分支名> |
eg:
1 | git push origin master //等价于git push origin master:master |
如果本地版本与远程版本有差异,但又要强制推送可以使用 —force 参数:
1 | git push --force origin master |
-f选项需要慎重考虑,但如果一个分支跟踪的都是一些自动生成的东西,那么强制推送就很有用。相当于忽略远程的内容都使用本次提交的。
git push可以将一个完全是本地仓库的内容推送到某个远程仓库的某个分支。这个太强了。
eg:将本地master分支的内容推送到远程仓库git@github.com:example.git
的autopage分支。
1 | git push -f git@github.com:example.git master:autopage |
拉取远程仓库
git pull 命令用于从远程获取代码并合并本地的版本。
1 | git pull <远程主机名> <远程分支名>:<本地分支名> |
设置本地分支跟踪远程分支
1 | git branch --set-upstream-to=origin/<远程分支名> <本地分支名> |
添加远程仓库后并不意味着分支也已经设置跟踪,有时候需要手动设置。如果没有设置的话,git pull就会提示:
1 | ➜ gitdemoprj git:(master) git pull --verbose |
如果想要查看设置的所有跟踪分支,可以使用 git branch
的 -vv
选项。 这会将所有的本地分支列出来并且包含更多的信息,如每一个分支正在跟踪哪个远程分支与本地分支是否是领先、落后或是都有。
1 | git branch -vv |
可以看到本地master分支还没有跟踪任何远程分支。
示例:
1 | ➜ gitdemoprj git:(master) git branch -u origin/master master |
查看tag
git tag —list
获取指定的tag处代码
git checkout tag
例如:git checkout v0.1.0创建本地分支
git branch 分支名
提交本地分支到服务器
git push origin <local_branch_name>:<remote_branch_name>
删除本地分支
git branch -d <BranchName>
注意:处于当前分支是不能进行删除分支自身操作的.删除远程分支
git push origin :分支名
根据tag创建分支
git branch <new-branch-name> <tag-name>
会根据tag创建新的分支.
例如:git branch newbranch v1.0 . 会以tag v1.0创建新的分支newbranch.git ignore文件
如果某些文件已经被纳入了版本管理中,就算是在.gitignore中已经声明了忽略路径也是不起作用的,这时候我们就应该先把本地缓存删除,然后再进行git的push,这样就不会出现忽略的文件了。git清除本地缓存命令如下:
1
2
3git rm -r --cached .
git add .
git commit -m 'update .gitignore'
切换分支
git首次切换到已经存在的分支.
先查看分支git branch -a
再git checkout origin/dev
这个时候已经出现了dev分支,但是我们不在这个分支上.可以执行一下:git branch -l
看看我们当前处于哪个分支上.这个时候我们再执行一下:git checkout dev
就可以了.如果已经切换过了则只需要
git checkout 分支名
问题
1.fatal: refusing to merge unrelated histories
场景描述:
本地的autopage分支是从master分支拉出来的,然后设置了跟踪远程origin/autopage分支,执行git pull时报上述错误,原因就是远程origin/autopage分支和本地autopage分支没有公共节点,也就是毫不相关,git无法帮你自动进行合并。两个分支的内容如下确实没有任何关系,所以需要自己决定如何合并:
解决办法:加参数—allow-unrelated-histories
1 | git pull --allow-unrelated-histories |
下面是合并后的图表:
执行完成后远程的内容原封不动保存在本地分支。
2.终端git status无法显示汉字,而是一堆utf8编码
解决办法:
1 | git config --global core.quotepath false |
参考
Git教程 4
Pro Git 5