一、一套代码推送至多个仓库
假设本地有个代码仓库 test
,是从 Github 上的 test
仓库克隆下来的。此时在Github上新建一个代码仓库test1
,想把本地代码仓库test
也推送至远程仓库 test1
下,该如何操作?
操作指令如下:
git remote add origin2 git@github.com:xxxx/test2.git git push origin2 master
其中 origin2
是别名,可以起任意名字。
二、常用指令
2.1 配置 user 信息
git config --global user.name 'your_name'
git config --global user.email 'your_email@domain.com'
config的三个作用域:
git config --local // local 只对某个仓库有效
git config --global // global 对当前用户所有仓库有效
git config --system // system 对系统所有登录的用户有效
显示config的配置,加--list
:
git config --list --local
git config --list --global
git config --list --system
2.2 git remote
为了便于管理,Git 要求每个远程主机都必须指定一个主机名(可以理解为别名)。git remote
命令就用于管理主机名。
不带选项的时候,git remote
命令列出所有远程主机。
$ git remote
origin
使用 -v
选项,可以参看远程主机的网址。
$ git remote -v
origin git@github.com:jquery/jquery.git (fetch)
origin git@github.com:jquery/jquery.git (push)
上面命令表示,当前只有一台远程主机,叫做origin,以及它的网址。
克隆版本库的时候,所使用的远程主机自动被 Git 命名为origin
。如果想用其他的主机名,需要用git clone
命令的-o
选项指定。
$ git clone -o jQuery https://github.com/jquery/jquery.git
$ git remote
jQuery
上面命令表示,克隆的时候,指定远程主机叫做jQuery。
git remote show
命令加上主机名,可以查看该主机的详细信息。
$ git remote show <主机名>
git remote add
命令用于添加远程主机。
$ git remote add <主机名> <网址>
git remote rm
命令用于删除远程主机。
$ git remote rm <主机名>
git remote rename
命令用于远程主机的改名。
$ git remote rename <原主机名> <新主机名>
2.3 git push
git push -u origin master
- 使用 -u 参数相当于设置了默认的推送的远程分支名字,下次就可以直接使用
git push
命令来推送代码。
将本地feature分支推送至远程分支feature:
git push origin feature:feature
- 第一个feature表示本地feature分支;
- 第二个feature表示远程服务器feature分支(名字可任取,取决于要推送的分支名);
2.4 git reflog
git reflog
显示整个本地仓储的 commit,包括所有 branch 的 commit,甚至包括已经撤销的 commit,只要HEAD发生了变化,就会在reflog里面看得到。而 git log
只包括当前分支的commit。每一次当前HEAD发生改变(包括切换branch、pull、添加新commit),一个新的纪录就会被添加到reflog。
举例:
运行 git reflog
0a2e358 HEAD@{0}: reset: moving to HEAD~2
0254ea7 HEAD@{1}: checkout: moving from 2.2 to master
c10f740 HEAD@{2}: checkout: moving from master to 2.2
上面的reflog 展示了从 master 到 2.2 分支,然后在回到master,然后在reset到老的commit。
如果你发现上面的reset是一次意外是一个错误,可以使用下面的命令反悔:
git reset --hard 0254ea7
2.5 git reset
有时候,进行了错误的提交,但是还没有push到远程分支,想要撤销本次提交,可以使用 git reset –-soft/hard
命令。
语法:
git reset —hard HEAD^
表示将版本库回退1个版本,但是不仅仅是将本地版本库的头指针全部重置到指定版本,也会重置暂存区,并且会将工作区代码也回退到这个版本。
其中 HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
。
git reset —soft HEAD~
表示将版本库软回退1个版本,所谓软回退表示将本地版本库的头指针全部重置到指定版本,且将这次提交之后的所有变更都移动到暂存区。
git reset HEAD <文件>
可以将添加到暂存区的文件重置成未跟踪状态。
注意:
git reset --hard head
:HEAD 表示当前版本,即重置本次提交;git reset --hard head^
:HEAD^ 表示上一个版本,表示重置到上次提交。
2.6 git stash
git stash
命令可以将在当前分支修改的内容放到缓存区中,并会自动建立一个缓存的list集合,方便管理。如果想将修改的内容重新释放出来,git stash apply
和 git stash pop
都可以达到这个目的。
但是两者有什么区别呢?
刚才说过,git stash 可以形成list 集合。通过git stash list
可以看到list下的缓存。
使用git stash apply @{x}
,可以将编号x的缓存释放出来,但是该缓存还存在于list中。
git stash apply
:会将当前分支的最后一次缓存的内容释放出来,但是刚才的记录还存在list中;git stash pop
:会将当前分支的最后一次缓存的内容释放出来,但是刚才的记录不存在list中;
2.7 git fetch
git pull
命令相当于git fetch
命令和git merge
命令的集合。git fetch
只会拉取远程的更新,但不会将远程的更新合并到本地。
由上图可以看出,运行 git fetch origin dev
命令,只是将拉取的远程更新存放至FETCH_HEAD
变量中。此时本地的文件没有任何变化,需运行 git merge FETCH_HEAD
命令,才能将远程更新合并到本地分支上。
适用场景:
先用 git fetch
命令查看哪些分支代码进行了更新,然后再看下这些更新是不是我们本地所需要的,如果更新不是我们所需要的,可以选择不合并代码。
合并远程分支代码:
git fetch origin some-branch:dev
通过该命令可以实现远程某个分支(some-branch)与本地dev分支的合并。如果本地dev分支不存在,git会自动创建dev分支。
2.8 git tag
打标签
git tag v1.0.0
需加上 --tags
才能给远程服务器推送tags。
git push origin master —tags
删除本地tag
git tag -d v1.0.0
删除远程服务器的tag
git push origin :refs/tags/v.1.0.0
2.9 如何删除远程服务器分支
删除本地feature分支
git branch -D feature
删除远程服务器feature分支
git push origin :feature
- 其中
:
表示前面没有任何分支的推送;
2.10 丢弃本地修改的所有文件
git checkout .
git clean -xdf
2.11 修改最后一次提交
对于你的最近一次提交,你往往想做两件事情:修改提交信息,或者修改你添加、修改和移除的文件的快照。
如果,你只是想修改最近一次提交的提交信息,那么很简单:
$ git commit —amend
这会把你带入文本编辑器,里面包含了你最近一条提交信息,供你修改。
当保存并关闭编辑器后,编辑器将会用你输入的内容替换最近一条提交信息。