git中可以给一些常用命令设置别名,这样就不用每次都输入长长的单词了,常用的别名设置为:
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.st status
然后就可以愉快的敲 git st 来查看当前状态了。
git br
* master
其中,master为当前分支名称。
git co -b branch-name
执行该指令后,会在本地创建一个新分支,该分支是从当前分支上检出的,所以所有文件内容都和当前分支一模一样,这是正常的。创建成功后,将自动切换至新分支上。
比如,我要创建dev分支,则运行以下代码:
$ git co -b dev
Switched to a new branch 'dev'
$ git br
* dev
master
可以看到当前存在两个分支,且已经切换到了dev分支。
$ git push origin dev:dev
Total 0 (delta 0), reused 0 (delta 0)
remote:
...
remote:
To github.com:DivineH/test.git
* [new branch] dev -> dev
我们通过 git push 命令将本地分支push到远程分支,其中,origin表示远程主机名称,查看github上的分支列表,可以看到如下分支:
可以看到,我们已经将本地dev分支上传到了远程服务器上。
我们可以使用 git br -d 或者 -D参数来删除本地分支,其中 -D 为强制删除:
$ git br -D dev
Deleted branch dev (was be8a89f).
$ git br
* master
那如何删除远程分支呢?我前面介绍了如何将本地分支同步到远程服务器的方法,我们同样可以借助 git push 来删除远程分支:
$ git br
* dev
master
$ git push origin :dev
- [deleted] dev
假如远程服务器存在了一个名为dev的分支,但是本地不存在此分支,那如何将该分支拉取到本地呢?
git checkout -b 本地分支名 origin/远程分支名
我们先删除本地的dev分支,然后再去远程服务器拉取分支:
$ git br -D dev
Deleted branch dev (was be8a89f).
$ git br
* master
$ git co -b dev origin/dev
Switched to a new branch 'dev'
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
$ git br
* dev
master
$ git st
On branch dev
Your branch is up to date with 'origin/dev'.
Untracked files:
(use "git add ..." to include in what will be committed)
main.cpp
nothing added to commit but untracked files present (use "git add" to track)
$ git add main.cpp
$ git st
On branch dev
Your branch is up to date with 'origin/dev'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: main.cpp
$ git ci -m 'add main.cpp'
[dev cd83d8f] add main.cpp
1 file changed, 9 insertions(+)
create mode 100644 main.cpp
$ git push
...
To github.com:DivineH/test.git
be8a89f..cd83d8f dev -> dev
其中 git st 可以查看当前仓库的状态,使用此命令能看到那些修改被暂存到了, 哪些没有, 哪些文件没有被Git tracked到。此时,我们可以使用 git add 来将那些untracked的文件track起来,之后,我们需要使用 git ci 命令将新增的文件提交到本地仓库中,最后,我们需要通过 git push 命令将本地修改同步到远程服务器上。
我们前面都是在dev分支上进行了修改,那如何将 dev 分支的修改同步到 master 分支上呢?
$ git co master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
$ ll
total 1
-rw-r--r-- 1 HC 197121 7 9月 22 18:04 README
我们首先切回到 master 分支,可以看到 master 分支是没有新增文件的,为了将 dev 分支的修改合并到 master 分支上,我们需要运行以下命令:
$ git merge dev
Updating be8a89f..cd83d8f
Fast-forward
main.cpp | 9 +++++++++
1 file changed, 9 insertions(+)
create mode 100644 main.cpp
$ ll
total 2
-rw-r--r-- 1 HC 197121 102 9月 22 18:49 main.cpp
-rw-r--r-- 1 HC 197121 7 9月 22 18:04 README
$ git push
Total 0 (delta 0), reused 0 (delta 0)
To github.com:DivineH/test.git
be8a89f..cd83d8f master -> master
通过 git merge 操作可以将其他分支合并到当前分支,然后通过 git push 将本地修改同步到远程服务器上,此时,如果 dev 分支已经不需要了,就可以将 dev 分支删除掉了。
回滚分支主要分为以下3种情况:
$ git st
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: main.cpp
比如,我们修改了 main.cpp 的代码,但是还没有执行 add 操作,此时,只需要进行简单的 git co – . 全部或者 git co – 来恢复具体的文件。
$ git co -- main.cpp
$ git st
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
$ git st
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: main.cpp
no changes added to commit (use "git add" and/or "git commit -a")
$ git add main.cpp
$ git st
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: main.cpp
此时,我们已经 add 了文件,但是还没有 commit ,此时,再通过 git co – 来恢复文件的结果如下所示:
$ git co -- main.cpp
$ git st
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: main.cpp
可以看到,文件并没有恢复,因为这些修改已经被放入缓存区了,这个时候,可以使用 git reset HEAD 命令来放弃指定的文件的缓存,如果要放弃所有修改的缓存,可以使用 git reset HEAD . ,如下所示:
$ git reset HEAD main.cpp
Unstaged changes after reset:
M main.cpp
$ git st
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: main.cpp
可以看到,执行 git reset 之后,当前状态已经恢复成 add 之前的状态,此时,可以通过 git co – 来放弃对文件的修改。
比如,我们已经将修改的文件执行了 commit 操作,此时,仓库的状态如下:
$ git st
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
该状态表示,本地分支领先于远程分支1个 commit 操作。
为了回滚分支,我们同样使用 git reset 来进行回滚,可以使用 git reset --hard HEAD^ 来回退到上一次 commit 的状态。
$ git reset --hard HEAD^
HEAD is now at cd83d8f add main.cpp
$ git st
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
$ git log
commit cd83d8f5b64a092a6f82afeec053289615a0bc23 (HEAD -> master, origin/master, origin/dev, dev)
Author: DivineH <[email protected]>
Date: Sun Sep 22 18:44:52 2019 +0800
add main.cpp
commit be8a89f2a21a11a0c3d2303489fdf09f24191e63
Author: DivineH <[email protected]>
Date: Sun Sep 22 18:04:21 2019 +0800
update README
commit c1842acbf281c5f9eeebc5ba5c44a1bf368d1761
Author: DivineH <[email protected]>
Date: Sun Sep 22 18:02:44 2019 +0800
add README
其中,HEAD^ 表示上一个版本,另外,使用此命令可以回退到任意版本:git reset --hard commitid
这里的 commitId 就是使用 git log 显示的提交历史中的 SHA 码,只需要前面几位即可。
$ git log
commit cd83d8f5b64a092a6f82afeec053289615a0bc23 (HEAD -> master, origin/master, origin/dev, dev)
Author: DivineH <[email protected]>
Date: Sun Sep 22 18:44:52 2019 +0800
add main.cpp
commit be8a89f2a21a11a0c3d2303489fdf09f24191e63
Author: DivineH <[email protected]>
Date: Sun Sep 22 18:04:21 2019 +0800
update README
commit c1842acbf281c5f9eeebc5ba5c44a1bf368d1761
Author: DivineH <[email protected]>
Date: Sun Sep 22 18:02:44 2019 +0800
add README
$ git reset --hard be8a89
HEAD is now at be8a89f update README
$ git log
commit be8a89f2a21a11a0c3d2303489fdf09f24191e63 (HEAD -> master)
Author: DivineH <[email protected]>
Date: Sun Sep 22 18:04:21 2019 +0800
update README
commit c1842acbf281c5f9eeebc5ba5c44a1bf368d1761
Author: DivineH <[email protected]>
Date: Sun Sep 22 18:02:44 2019 +0800
add README
可以看到,此时,仓库已经回退到了 be8a89f2a21a11a0c3d2303489fdf09f24191e63 这个版本。