一、一套代码推送至多个仓库

假设本地有个代码仓库 test,是从 Github 上的 test仓库克隆下来的。此时在Github上新建一个代码仓库test1,想把本地代码仓库test也推送至远程仓库 test1下,该如何操作

操作指令如下:

git remote add origin2 git@github.com:xxxx/test2.git git push origin2 master

其中 origin2别名,可以起任意名字。

二、常用指令

image.png

2.1 配置 user 信息

  1. git config --global user.name 'your_name'
  2. 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 applygit 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 只会拉取远程的更新,但不会将远程的更新合并到本地。
image.png
由上图可以看出,运行 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

这会把你带入文本编辑器,里面包含了你最近一条提交信息,供你修改。

当保存并关闭编辑器后,编辑器将会用你输入的内容替换最近一条提交信息。