Git 常用命令

git

一些 git 常用命令总结。

仓库管理

Clone 远程仓库

git clone <repo url>

url 有两种:

  • https://github.com/username/reponame.git
  • git@github.com:username/reponame.git

Clone 远程仓库指定分支

git clone -b <remote branch name> <repo url>

Clone 含子模块的仓库

若需要克隆含有子模块的仓库,直接进行克隆无法拉取子模块的代码,可加上 --recursive 参数,如:

git clone --recursive <repo url>

或者:

git clone <repo url>
git submodule init
git submodule update

查看已添加的远程仓库

git remote -v

查看远程仓库的信息

git remote show <repo name>

例如:

git remote show origin

添加远程仓库

git remote add <repo name> <repo url>

repo name 为远程仓库的本地名称,可自定义,相当于给 url 对应的仓库起了个别名,对于 git clone 的仓库在本地的名称默认为 origin

删除远程仓库

git remote rm <repo name>

修改远程仓库

git remote set-url [--push|--add|--delete] <repo name> <new url> [<old url>]
可选项:
--push                manipulate push URLs
--add                 add URL
--delete              delete URLs

例如:

git remote set-url origin git@github.com:username/reponame.git

拉取远程仓库

git pull [<repo name> <branch name>]

这里的 repo namebranch name 都是远程的

推送远程仓库

git push [<repo name> <branch name>]

这里的 repo name 是远程的, branch name 为本地分支名

例如:

git push origin master

分支管理

查看分支

查看本地分支

前面有 “*” 标记的为当前所在分支

git branch

查看远程分支

git branch -r

查看所有分支

查看所有分支,包括本地的和远程的

git branch -a

删除分支

删除远程分支

推送一个空分支以删除远程分支,本地分支依然存在

git push <repo name> :<remote branch name>

或者

git push <repo name> --delete <remote branch name>

repo name 为仓库的本地别名,默认为 origin

例如:

git push origin :develop

删除本地分支

git branch -d <branch name>

-d 选项只能删除已参与了合并的分支,对于未合并的分支是无法删除的,如果想强制删除一个分支,可以使用 -D 选项。

切换分支

git checkout <branch name>

创建分支

创建本地分支

git branch <Branch Name>

创建本地分支并切换到新分支

git checkout -b <branch name>

创建远程分支

git push [-u] <repo name> <local branch name>:<remote branch name>

例如:

提交本地 dev 分支作为远程的 develop 分支,实际应用中 应该保持本地分支名称与远程分支名称一致

git push origin dev:develop

如果本地分支名称与远程分支名称不一致,在 git push 时会有如下提示:

$ git push
fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:develop

To push to the branch of the same name on the remote, use

    git push origin dev

To choose either option permanently, see push.default in 'git help config'.
  • 如果使用 git push origin HEAD:develop ,则会将当前 HEAD 指向的 dev 分支 push 到远程的 develop 分支
  • 如果使用 git push origin dev ,则会在远程仓库中创建一个名为 “dev” 的新分支(如果原先不存在),并将当前本地的 dev 分支推送到远程的 dev 分支
  • 如果推送时使用 -u 选项,Git 不但会把本地的 dev 分支内容推送的远程新的 develop 分支,还会把本地的 dev 分支和远程的 develop 分支关联起来,以后在推送或者拉取时就可以使用简化命令 git push|pull

关联本地分支与远程分支

如果已添加远程仓库,但是本地分支与远程分支没有关联,使用 git pull 会导致失败:

$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> dev

错误提示也给出解决方法:

方法一:指定要拉取的仓库的分支

git pull <repo name> <branch name>

这里我把 remote 写成 repo name 是为了与上面保持一致,其含义也是相同的,都是表示远程仓库在本地的别名。一般而言,远程远程仓库名为项目名称,而在本地代表该仓库的名称默认为"origin"

方法二:关联本地分支与远程分支

git branch --set-upstream-to=<repo name>/<remote branch name> <local branch name>

在关联本地分支与远程分支之后,就不用每次都指定仓库名和分支名了,只需执行 git pull

查看本地分支与远程分支的跟踪关系

git branch -vv

可看到当前分支与对应的远程关联分支

合并分支

合并本地分支

git merge <branch name>

例如:将 “dev” 分支合并到当前分支

git merge dev

合并远程分支

  • 先检出仓库

    git clone <url>
    
  • 默认为 master 分支,然后查看全部的远程分支

    git branch -r
    

    例如:

    $ git branch -r
      origin/develop
      origin/master
    
  • 切换分支,要合并到哪个分支就切换到哪个分支

    如果要合并到 master 分支,就不用切换

  • 合并分支

    例如:将远程的 develop 分支合并到 master 分支

    git merge origin/develop
    
  • 推送合并后的分支

    git push
    

分支重命名

本地分支重命名

git branch -m <old name> <new name>

远程分支重命名

  • 重命名远程分支对应的本地分支

    git branch -m <old name> <new name>
    
  • 删除远程分支

    git push --delete <origin> <old name>
    
  • 上传新命名的本地分支

    git push <origin> <new name>
    
  • 把修改后的本地分支与远程分支关联

    git branch --set-upstream-to=<origin>/<new name>
    

工作现场的保存与恢复

分支修改相互影响

现象:

假设当前有两个分支,一个 master 分支,一个 dev 分支。 master 分支的工作区和暂存区( stage )是干净的,也即 nothing to commit, working tree clean, dev 分支由 master 分支 checkout 并创建得到。假设此时在 dev 分支下创建一个文件 touch abc.txt ,然后切回 master 分支,会发现 master 分支下的工作区也包含该文件。

原因:

git 切换分支时会把未 add 或未 commit 的内容带过去。未 add 的内容不属于任何一个分支,未 commit 的内容也不属于任何一个分支,也就是说,对于所有分支而言,工作区和暂存区都是共享的。未 add 的内容会存放在工作区,已 add 且未 commit 的内容会存放在暂存区( stage ),对于 add 后已 commit 的内容独立存放当前分支。

解决方法:

总的来说,只要保证工作区和暂存区是干净的就可以了。

具体来说通常有以下两种方法:

  • 使用 git addgit commit 提交修改,那么此时使用 git status 检查工作区和暂存区就是干净的
  • 如果当前分支上的工作还未完成或者还不能提交,但又需要去修改其它分支的,这时可以把当前分支的工作现场保存起来。使用 git stash 可以保存当前暂存区的内容,此时使用 git status 检查工作区和暂存区就是干净的,详情查看工作现场的保存与恢复。

保存工作现场

git stash 可以保存当前工作现场,实际上是保存当前暂存区( stage )的内容,对于未 add (未跟踪)的文件的修改不会保存(不会隐藏)。stash 功能,可以让我们暂时放下当前分支的工作,转而切换到另一分支进行其它工作,在完成其它分支工作后,可以切回该分支恢复现场继续未完成的工作。

注意:如果当前分支中,不存在未 add 的文件,执行 git stash 保存工作现场后,此时使用 git status 检查工作区和暂存区就是干净的,如果存在未 add 的文件,那么工作区是不干净的而暂存区是干净的。

举例来说,如果修改发生在新文件中且已 add,那么 git stash 后工作区将不会看到该新文件;如果修改发生在新文件中且未 add ,那么 git stash 不会对该文件进行任何操作,该文件依然在工作区中可见。

可以多次 stash ,包括同一分支多次 stash ,不同分支多次 stash。

查看保存的工作现场

git stash list

恢复工作现场

恢复现场有两种方法:

  • 使用 git stash apply 恢复,但是恢复后,stash 内容并不删除,需要用 git stash drop 来删除
  • 使用 git stash pop ,恢复的同时把 stash 内容删除,这时用 git stash list 就看不到已经 pop 了的工作现场了

恢复的时候,先用 git stash list 查看,然后用 git stash apply <stash@{id}> 或者 git stash pop <stash@{id}> 恢复指定的 stash ,例如 git stash apply stash@{0}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值