git使用方法小结

本地文件添加到github

  • 第一步生成ssh key
1
ssh-keygen -t rsa -C "your_email@youremail.com"

后面的 your_email@youremail.com 改为你在github上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。

成功的话会在当前用户~/下生成.ssh文件夹,如我的目录是C:\Users\xxx\ .ssh,打开id_rsa.pub,复制里面的key(可以把这个公钥文件删除,只保留id_rsa私钥文件)。

回到github上,进入 Account Settings(账户配置),左边选择SSH Keys,Add SSH Key,title随便填,粘贴在你电脑上生成的key。

验证是否成功的方法:

1
ssh -T git@github.com

在git bash下输入上面的,如果有看到You've successfully authenticated, but GitHub does not provide shell access 。这就表示已成功连上github。

  • 第二步建立git的仓库,在github上面新建一个repository即可。如果是为了保存资料,是可以新建repository时选择private。这样就不会公开了。创建好了之后,会有以下提示:

    新仓库,需要做的事情:

    1
    2
    3
    4
    5
    6
    7
    echo "# hexo" >> README.md
    git init
    git add README.md
    git commit -m "first commit"
    git branch -M master
    git remote add origin git@github.com:fang141x/hexo.git
    git push -u origin master

    已有仓库,

    1
    2
    3
    git remote add origin git@github.com:fang141x/hexo.git
    git branch -M master
    git push -u origin master
  • 第三步建立git的本地仓库。之前有建立好本地仓库就可以跳过这一步了。

1
2
3
4
5
6
7
8
cd /E/shell
echo "# shell" >> README.md
#初始化本地仓库,这时会在目录下创建.git
git init
#将项目的所有文件添加到仓库中
git add .
#将add的文件commit到仓库
git commit -m "first commit"
  • 第四步,上传代码
1
2
3
4
5
6
7
8
#配置username和email,github每次commit都会需要这2个参数
git config --global user.name "xxx"
git config --global user.email "xxx@qq.com"

#将本地的仓库关联到github上
git remote add origin git@github.com:xxx/xxx.git
#将代码到github远程仓库
git push -u origin master

这样就完成了git上传代码的过程。

有时一些文件不需要同步,我们可以在仓库的目录下创建 .gitignore 文件,把不需要同步的文件名写上去就了。以下表示 不同步assets文件名,但是_posts/assets这个目录需要同步。

1
2
3
$ cat .gitignore 
assets
!_posts/assets

同步数据

  • 从github同步代码到本地
1
2
cd /f/
git clone git@github.com:fang141x/shell.git

首先进入f盘,直接使用git clone就可以了。如上,就会在F:/shell/上面创建一个目录,注意,此目录不能存在。

  • 同步远程文件到本地
    输入 git remote -v,查看远程仓库:git pull origin master从远端同步数据到本地
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ git remote -v
origin git@github.com:fang141x/shell.git (fetch)
origin git@github.com:fang141x/shell.git (push)

fangdm@DESKTOP-ILP480A MINGW64 ~/shell (master)
$ git pull origin master
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 8 (delta 4), reused 6 (delta 2), pack-reused 0
Unpacking objects: 100% (8/8), done.
From github.com:fang141x/shell
* branch master -> FETCH_HEAD
f1bdc2c..ed75d6b master -> origin/master
Updating f1bdc2c..ed75d6b
Fast-forward
debug.log | 2102 ++++++++++++++++++++
...00\237\345\221\275\344\273\244\351\233\206.qbl" | 164 ++
2 files changed, 2266 insertions(+)
create mode 100644 debug.log
create mode 100644 "\351\273\230\350\256\244\345\277\253\351\200\237\345\221\275\344\273\244\351\233\206.qbl"

本地仓库

本地仓库可以分为工作区和版本库。由 git 维护的三棵”树”组成。

  • 第一个是你的 工作目录,它持有实际文件;
  • 第二个是 暂存区(Index/stage),它像个缓存区域,临时保存你的改动;
  • 最后是 HEAD,它指向你最后一次提交的结果。

image

你可以提出更改(把它们添加到暂存区),使用如下命令:

1
2
git add <filename>
git add *

这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:

1
git commit -m "代码提交信息"

现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库。

分支管理

本地仓库操作

  • 建立分支

创建dev分支,然后切换到dev分支,git checkout -b dev相当于2条命令,git branch dev、git checkout dev

1
2
3
4
5
[root@home gitstudy]#git checkout -b dev
Switched to a new branch 'dev'
[root@home gitstudy]#git branch
* dev
master

git branch命令会列出所有分支,当前分支前面会标一个*号。

  • 修改文件且commit
1
2
3
4
5
6
[root@home gitstudy]#echo 'Creating a new branch is quick.' >>test.txt
[root@home gitstudy]#
[root@home gitstudy]#git add test.txt
[root@home gitstudy]#git commit -m "branch test"
[dev 35132aa] branch test
1 files changed, 1 insertions(+), 0 deletions(-)
  • 合并分支:git merge命令用于合并指定分支到当前分支
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@home gitstudy]#git checkout master
Switched to branch 'master'
[root@home gitstudy]#git branch
dev
* master

[root@home gitstudy]#cat test.txt
Git is a distributed version control system.

Git is free software.
test
[root@home gitstudy]#git merge dev
Updating 69345bb..35132aa
Fast-forward
test.txt | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。我们可以使用—no-ff来关闭fast forward,这里Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

  • 删除分支:合并完成后,就可以放心地删除dev分支了:
1
2
3
4
[root@home gitstudy]#git branch -d dev
Deleted branch dev (was 35132aa).
[root@home gitstudy]#git branch
* master

远程仓库操作

我们也可以直接将分支同步到github上。

  • 将新分支发布在github上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git push origin dev
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 280 bytes | 280.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:fang141x/python.git
* [new branch] dev -> dev


#在github远程端删除一个分(分支名前的冒号代表删除)
$ git push origin :dev
To github.com:fang141x/python.git
- [deleted] dev
  • 将github上的分支同步下来
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ git checkout -b dev origin/dev
Switched to a new branch 'dev'
Branch dev set up to track remote branch dev from origin.
$ git branch
* dev
master
$ git add test.txt
$ git commit -m "add name"
[dev d9229d5] add name
1 file changed, 2 insertions(+), 1 deletion(-)

$ git push origin dev
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 282 bytes | 141.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:fang141x/python.git
364e514..d9229d5 dev -> dev
  • Git鼓励大量使用分支:
1
2
3
4
5
6
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>

解决冲突

如果在合并分支时,在master里面又修改了同一个文件,同时也commit到同步库,这时进行合并就会出现异常了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#这时合并就会提示有冲突了
[root@home gitstudy]#git merge feature1
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.

#这时文件内容会发现变化
[root@home gitstudy]#cat test.txt
Git is a distributed version control system.

Git is free software.
test
Creating a new branch is quick.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

#使用git status就可以看到是哪个文件有冲突了
[root@home gitstudy]#git status
# On branch master
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: test.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

我们需要手工修改这个文件之后,再次add/commit就可以了。也就是有冲突了,就需要手工解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@home gitstudy]#git add test.txt
[root@home gitstudy]#git commit -m "conflict fixed"
[master 562533a] conflict fixed
[root@home gitstudy]#git log --graph --pretty=oneline --abbrev-commit
* 562533a conflict fixed
|\
| * fe70421 And simple
* | 55c7613 & simple
|/
* 35132aa branch test
* 69345bb remove test.txt
* 56a0e8f a.txt
* 3994ba3 add dd
* 164dd36 add test.txt
* ccd4067 add test.txt

可以用gitlog --graph命令可以看到分支合并图。
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

git其他常用命令

  • git status
1
2
3
[root@home gitstudy]#git status
# On branch master
nothing to commit (working directory clean)

Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working directory clean)的。

  • git diff 查看修改了哪些内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@home gitstudy]#git diff test.txt 
    diff --git a/test.txt b/test.txt
    index a4c0a67..bb0f9ef 100644
    --- a/test.txt
    +++ b/test.txt
    @@ -1,3 +1,4 @@
    Git is a distributed version control system.

    Git is free software.
    +test
  • git log查看commit的提交日志

1
2
3
4
[root@home gitstudy]#git log --pretty=oneline
3994ba33b9236a1d80e3146babf64202e9ed832b add dd
164dd363a2f66bfe8f289798a3d93f913416cce7 add test.txt
ccd40670223d1d2aedfb073b72b08dedc7f12044 add test.txt
  • git reset 可以根据commitid来指定回退版本
1
2
3
#此为回退到前一个版本
[root@home gitstudy]#git reset --hard HEAD^
HEAD is now at 164dd36 add test.tx

可以指定commit id来需要回退或者到哪个版本下。

1
2
3
4
5
6
7
8
9
10
[root@home gitstudy]#cat test.txt 
Git is a distributed version control system.
Git is free software.
[root@home gitstudy]#
[root@home gitstudy]#git reset --hard 3994ba33b9
HEAD is now at 3994ba3 add dd
[root@home gitstudy]#cat test.txt
Git is a distributed version control system.
Git is free software.
test

  • git reflog 用来记录reset的日志
1
2
3
4
5
6
[root@home gitstudy]#git reflog
ccd4067 HEAD@{0}: ccd40670223d1d2: updating HEAD
3994ba3 HEAD@{1}: 3994ba33b9: updating HEAD
164dd36 HEAD@{2}: HEAD^: updating HEAD
3994ba3 HEAD@{3}: commit: add dd
164dd36 HEAD@{4}: commit: add test.txt
  • git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[root@home gitstudy]#echo 'checkout' >test.txt 
[root@home gitstudy]#cat test.txt
checkout
#修改文件后,status查看会提示要git add,或者使用git checkout来放弃修改
[root@home gitstudy]#git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: test.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@home gitstudy]#git add test.txt

#这边git add了一下,使用status查看可以看到需要给commit或者使用git reset HEAD file可以把暂存区的修改撤销掉(unstage)
[root@home gitstudy]#git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: test.txt
#
[root@home gitstudy]#git reset HEAD test.txt
Unstaged changes after reset:
M test.txt
[root@home gitstudy]#git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: test.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@home gitstudy]#cat test.txt
checkout
[root@home gitstudy]#git checkout -- test.txt
[root@home gitstudy]#cat test.txt
Git is a distributed version control system.

Git is free software.
test
  • git rm 从版本库里面删除文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#先加一个新文件
[root@home gitstudy]#echo '333' >a.txt
[root@home gitstudy]#git add a.txt
[root@home gitstudy]#git commit -m 'a.txt'
[master 56a0e8f] a.txt
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 a.txt
[root@home gitstudy]#git status
# On branch master
nothing to commit (working directory clean)
#再删除
[root@home gitstudy]#rm -f a.txt
[root@home gitstudy]#git rm a.txt
rm 'a.txt'
[root@home gitstudy]#git commit -m "remove a.txt"
[master 69345bb] remove a.txt
1 files changed, 0 insertions(+), 1 deletions(-)
delete mode 100644 a.txt
[root@home gitstudy]#git status
# On branch master
nothing to commit (working directory clean)

标签

1
2
3
4
5
6
7
8
9
命令git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
git tag -a <tagname> -m "blablabla..."可以指定标签信息;
git tag -s <tagname> -m "blablabla..."可以用PGP签名标签;

命令git tag可以查看所有标签。
命令git push origin <tagname>可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d <tagname>可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

总结

  • 管理修改

    每次修改,如果不add到暂存区,那就不会加入到commit中

  • 撤销修改

    • 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

    • 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

  • 删除文件,在本地删除了一个文件之后

    • 场景1:确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit
    • 场景2:删错了,因为版本库里还有呢,所以可以使用git checkout -- file,很轻松地把误删的文件恢复到最新版本

最后引用 https://zhuanlan.zhihu.com/p/94008510 的流程图来结尾:

git

  • 本文作者: wumingx
  • 本文链接: https://www.wumingx.com/linux/git.html
  • 本文主题: git使用方法小结
  • 版权声明: 本站所有文章除特别声明外,转载请注明出处!如有侵权,请联系我删除。
0%