0%

git常用命令使用

在现有目录中初始化仓库

1
git init

执行后,会创建一个.git文件夹

1
2
3
4
➜  gitdemoprj git init
Initialized empty Git repository in /Users/xuequan/Desktop/gitdemoprj/.git/
➜ gitdemoprj git:(main)ls -a
. .. .git.md

目前默认创建的分支名是main,不是master了。不注意的话后续一些操作比如push等等可能会出错。如果git init时不想使用默认的main分支名怎么办呢?

方法1:在初始化的时候指定分支名

1
git init -b master //这里指定为master

方法2:全局设置初始化的分支名称。

1
2
3
git config --global init.defaultBranch <name>
示例:
git config --global init.defaultBranch master

该命令会在~/.gitconfig文件里添加配置:

1
2
[init]
defaultBranch = master

以后使用git init初始化后默认的就都是master了。

可是我现在已经是main分支了,想修改为master怎么办呢?那只能采用修改分支名的方法嘞。

ps:这个时候查看分支git branch是不会显示任何分支的。因为git的分支必须指向一个commit,没有任何commit就没有任何分支,提交第一个commit后git自动创建master分支。

继续提交操作:

1
2
3
4
git add .
git commit -m "git init"
git branch
* master //出现了。

查看分支

1
2
3
git branch //查看本地所有分支
git branch -r //查看远程所有分支
git branch -a //查看本地和远程所有分支

如果是远程分支则前面会有remotes/

修改分支名

假设该分支还没有推送到远程,可以使用下面的命令:

1
2
3
git branch -m <name>
示例:
git branch -m master

git 中一些选项解释

1
2
3
4
5
6
7
-d  --delete:删除
-D --delete --force的快捷键
-f --force:强制
-m --move:移动或重命名
-M --move --force的快捷键
-r --remote:远程
-a --all:所有

添加远程仓库

如果想多人协作,那么就需要给本地仓库添加一个远程仓库。

1
2
3
git remote add <shortname> <url>
示例:
git remote add origin xxx.git

shortname就代表url相当于起个名字,方便后续操作。当然如果你不嫌麻烦直接用url也是可以的,有时候也确实会直接用url。

查看远程仓库

1
2
3
git remote
git remote -v
git remote show origin

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
➜  gitdemoprj git:(master) git remote
origin
➜ gitdemoprj git:(master) git remote -v //查看远程仓库详细信息,会展示出对应url
origin example.git (fetch)
origin example.git (push)
➜ gitdemoprj git:(master) git remote show origin //更加详细的信息
* remote origin
Fetch URL: example.git
Push URL: example.git
HEAD branch: master
Remote branch:
master tracked
Local ref configured for 'git push':
master pushes to master (up to date)

推送到远程仓库

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
2
git pull <远程主机名> <远程分支名>:<本地分支名>
git pull //如果远程分支是与当前分支合并,可以简写

设置本地分支跟踪远程分支

1
2
git branch --set-upstream-to=origin/<远程分支名> <本地分支名>
git branch -u origin/<远程分支名> <本地分支名>

添加远程仓库后并不意味着分支也已经设置跟踪,有时候需要手动设置。如果没有设置的话,git pull就会提示:

1
2
3
4
5
6
➜  gitdemoprj git:(master) git pull --verbose
From github.com:xq-120/gitdemo
= [up to date] autopage -> origin/autopage
= [up to date] master -> origin/master
There is no tracking information for the current branch.
Please specify which branch you want to merge with.

如果想要查看设置的所有跟踪分支,可以使用 git branch-vv 选项。 这会将所有的本地分支列出来并且包含更多的信息,如每一个分支正在跟踪哪个远程分支与本地分支是否是领先、落后或是都有。

1
2
3
git branch -vv
//打印
* master abae279 git init

可以看到本地master分支还没有跟踪任何远程分支。

示例:

1
2
3
4
5
➜  gitdemoprj git:(master) git branch -u origin/master master
branch 'master' set up to track 'origin/master'.

➜ gitdemoprj git:(master) git branch -vv
* master abae279 [origin/master] git init //本地master分支已设置跟踪远程分支origin/master
  • 查看taggit 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
    3
    git rm ---cached .
    git add .
    git commit -'update .gitignore'

切换分支

  1. git首次切换到已经存在的分支.
    先查看分支git branch -agit checkout origin/dev这个时候已经出现了dev分支,但是我们不在这个分支上.可以执行一下:
    git branch -l看看我们当前处于哪个分支上.这个时候我们再执行一下:git checkout dev就可以了.

  2. 如果已经切换过了则只需要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 branch不显示本地分支的问题(二)

Git教程 4

Pro Git 5

觉得文章有帮助可以打赏一下哦!