Git相关学习总结

前言

Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理,在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术,可以实现项目多人协作开发,对相关话术进行说明:

  • 工作区:可以理解为git仓库所在的目录,工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
  • 版本库:Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
  • git add命令是将文件添加至暂存区,git commit是将内容提交至当前分支。

参考文档

  • 廖雪峰大神git教程
  • 一小时学会git
  • git官方网站
  • git命令总结

环境配置

首先进入软件的下载,进入git官网,根据自己的需求下载即可,本次主要针对windows进行讲解说明,下载完成后直接进行安装即可,安装时根据自己的需求选择所需的配置,安装完成后如下图所示:

Git相关学习总结_第1张图片

安装完成后进行相关的设置:

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

运行完后生成一个.gitconfig的文件,使用Notepad++打开,可以看到配置文件:

Git相关学习总结_第2张图片

git-bash和git-cmd为我们常用的,git-bash类似于linux和unix的命令行,git-cmd类似于windows的命令行,我们本次使用git-bash,为了便于我们使用,先对常用命令行进行介绍:

  • cd ,改变目录(如:cd ~回home、cd .. 返回上一目录)
  • pwd,显示当前目录,如:shanyonggang@02CZLDZB024 MINGW64 ~$ pwd      /c/Users/shanyonggang
  • ll和ls ,显示当前目录的所有文件
  • touch,新建一个文件 如 touch text.txt就会在当前目录下新建一个text.txt文件。
  • rm,删除文件
  • mkdir,新建目录,即新建一个文件夹
  • rm -r,删除一个文件夹
  • mv,移动文件
  • reset,重新初始化终端
  • clear,清除屏幕
  • history,查看历史命令
  • cat,查看文件内容

创建版本库

选择合适的地方创建一个新目录(博主在E盘下创建了learn_git文件夹):

$ cd E:\learn_git

使用git init命令将此目录变成git可以管理的仓库:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git
$ git init
Initialized empty Git repository in E:/learn_git/.git/

完成后会在该目录下生成.git的文件夹,此文件夹可能在隐藏的,windows如何查看可以参考Windows:显示隐藏文件或文件夹,也可以使用命令,ls -ah即可看到有.git文件

在该目录下添加一个test.txt文件,内容随意写,完成后使用git add命令将文件添加到仓库:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git add test.txt

完成后没提示任何命令,则说明成功

用命令git commit告诉Git,把文件提交到仓库:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git commit -m 'first commit'
[master (root-commit) 13ef42c] first commit
 1 file changed, 12 insertions(+)
 create mode 100644 test.txt

-m 后面表示内容的修改说明(此处可以写自己本次更改的大致内容,便于自己后续查找某版本)

修改版本

前面我们已经了解了如何提交文件到仓库,修改也类似,先对文件进行修改,然后进行相应的添加、提交,但当我们发现出现问题想撤回到我们所需要的版本时候,可以按下述进行操作,首先学习一个新命令,git log命令可以进行查看,首先我们对test.txt文件进行两次修改:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git add test.txt

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git commit -m "delete something"
[master 6a485b2] delete something
 1 file changed, 4 deletions(-)

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git add test.txt

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git commit -m "add something"
[master cc8a888] add something
 1 file changed, 2 insertions(+)

上面我们对test.txt文件进行了更改,接下来使用git log命令查看:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git log
commit cc8a8889992ea4641383cc5932794a5cb2b84c33 (HEAD -> master)
Author: shanyonggang <511248513@qq.com>
Date:   Mon Dec 9 13:14:16 2019 +0800

    add something

commit 6a485b288f47f439ff8c7a45f2448a8976b5e9a9
Author: shanyonggang <511248513@qq.com>
Date:   Mon Dec 9 13:13:43 2019 +0800

    delete something

commit 13ef42cea4254967e7393d0abfb074d1c55e9412
Author: shanyonggang <511248513@qq.com>
Date:   Mon Dec 9 11:44:51 2019 +0800

    first commit

根据上面我们可以看到我们总共提交了三次,如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git log --pretty=oneline
cc8a8889992ea4641383cc5932794a5cb2b84c33 (HEAD -> master) add something
6a485b288f47f439ff8c7a45f2448a8976b5e9a9 delete something
13ef42cea4254967e7393d0abfb074d1c55e9412 first commit

需要友情提示的是,你看到的一大串类似cc8a8889992ea...的是commit id(版本号)

现在我们要返回上一个版本,使用git reset --hard命令(当前一个版本时使用~1,前N个版本时使用~N)

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git reset --hard HEAD~1
HEAD is now at 6a485b2 delete something

这样我们就返回到上一个版本了,运行git log可以看到就只有两次提交了:

commit 6a485b288f47f439ff8c7a45f2448a8976b5e9a9 (HEAD -> master)
Author: shanyonggang <511248513@qq.com>
Date:   Mon Dec 9 13:13:43 2019 +0800

    delete something

commit 13ef42cea4254967e7393d0abfb074d1c55e9412
Author: shanyonggang <511248513@qq.com>
Date:   Mon Dec 9 11:44:51 2019 +0800

    first commit

当版本过多,如果根据上面我们需要返回前面的某个版本时候,需要一一的数,这样比较麻烦,因此采用命令,git reset --hard 6a485b2(这个位版本号),当我们后悔了又想回到最新的版本时候,则需要先使用git reflog命令查看最新版本的commit id:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git reflog
6a485b2 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~1
cc8a888 HEAD@{1}: commit: add something
6a485b2 (HEAD -> master) HEAD@{2}: commit: delete something
13ef42c HEAD@{3}: commit (initial): first commit

然后使用git reset --hard commit id:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git reset --hard cc8a888
HEAD is now at cc8a888 add something

这样我们又返回到了最新的版本。

工作区文件修改:在git add之前,当我们发现文件有问题时,可以使用git checkout -- test.txt命令进行修改撤回

暂存区文件修改:在git add之后,git commit之前,当发现文件有问题时候,用命令git reset HEAD 可以把暂存区的修改撤销掉(unstage),重新放回工作区,git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。

短暂总结:

  • 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
  • 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作。
  • 已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本撤回,不过前提是没有推送到远程库。

删除文件使用git rm

远程仓库

首先我们需要将本地Git仓库和Github仓库连接起来:

平时我们需要将我们的代码存储至github或码云上,需要进行远程仓库的链接操作,由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:

第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -C "[email protected]"

第2步:登陆GitHub,打开“Account settings”,进行“SSH Keys”设置

接下来进行远程仓库的添加:

Git相关学习总结_第3张图片

Git相关学习总结_第4张图片

目前,在GitHub上的这个learngit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。

我们先使用本地仓库连接,在目录下运行:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git remote add origin git@github.com:ShanYonggang/git_learn.git

下一步,就可以把本地库的所有内容推送到远程库上:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git push -u origin master
Warning: Permanently added the RSA host key for IP address '13.229.188.59' to the list of known hosts.
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 4 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 1.01 KiB | 1.01 MiB/s, done.
Total 9 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), done.
To github.com:ShanYonggang/git_learn.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

我们重新刷新github页面,即可看到本地文件已经提交到github仓库内:

Git相关学习总结_第5张图片

分支管理

首先使用如下命令创建分支:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev

运行我们可以看到如下(后面的分支已经切换,由master变成dev):

Git相关学习总结_第6张图片

我们可以使用git branch进行查看:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git branch
* dev
  master

git branch会列出所有分支并在当前分支之前加*

对我们之前的test.txt进行修改,添加如下内容:

add branch 
git checkout -b dev
git branch

然后使用git add、commit进行提交:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git add test.txt

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git commit -m 'add branch'
[dev d7206b0] add branch
 1 file changed, 4 insertions(+), 2 deletions(-)

现在,dev分支的工作完成,我们就可以切换回master分支:

$ git chechout master

切换完后神奇的一幕出现了,我们会发现我们之前添加的内容不见了,接下来将分支成果合并到master主分支上:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git merge dev
Updating b63ba90..d7206b0
Fast-forward
 test.txt | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

打开文件我们发现我们在dev分支上添加的内容已经存储进来,完成后使用git branch -d test.txt

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git branch -d dev
Deleted branch dev (was d7206b0).

短暂总结

  • 查看分支:git branch
  • 创建分支:git branch
  • 切换分支:git checkout 或者git switch
  • 创建+切换分支:git checkout -b 或者git switch -c
  • 合并某分支到当前分支:git merge
  • 删除分支:git branch -d

bug分支

软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

当我们正在一个dev分支上进行修改开发时,突然领导通知要马上修复一个bug,此时我们dev分支未开发完,我们也不想提交,幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git stash
Saved working directory and index state WIP on dev: d7206b0 add branch

这样我们的dev分支上的内容就被存储起来了,接下来我们返回master分支,新建一个修改bug的分支,git checkout -m branch_bug,然后我们在该bug分支上完成修改和提交,修复完该bug后,进行删除该bug分支,然后我们需要返回我们之前的dev分支继续我们的工作,用git stash list命令看看:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git stash list
stash@{0}: WIP on dev: d7206b0 add branch

然后我们需要对其进行恢复:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git stash apply
On branch dev
Changes to be committed:
  (use "git reset HEAD ..." to unstage)

        new file:   ad.txt

Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   test.txt

其中:

  • 一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
  • 另一种方式是用git stash pop,恢复的同时把stash内容也删了;

Feature分支

软件开发中,总有无穷无尽的新的功能要不断添加进来。

添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。

要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。

多人协作

要查看远程库的信息,用git remote:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git remote
origin

git remote -v显示更详细的信息:

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git remote -v
origin  git@github.com:ShanYonggang/git_learn.git (fetch)
origin  git@github.com:ShanYonggang/git_learn.git (push)

推送分支:

使用git push origin master(主分支)进行推送,也可以进行其他分支的推送

shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git push origin master
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 4 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 801 bytes | 801.00 KiB/s, done.
Total 9 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), completed with 1 local object.
To github.com:ShanYonggang/git_learn.git
   cc8a888..946bd4e  master -> master
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

整体总结

  1. 初始化一个Git仓库,使用git init命令。
  2. 使用命令git add ,注意,可反复多次使用,添加多个文件
  3. 使用命令git commit -m ,完成提交
  4. 使用命令git status可以让我们时刻掌握仓库当前的状态
  5. 使用命令git diff 可以查看修改了什么内容
  6. Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id使用git reset HEAD 将暂存区文件放回工作区
  7. 使用git log命令可以查看提交历史,以便确定要回退到哪个版本。
  8. 使用命令git reflog查看命令历史,以便确定要回到未来的哪个版本
  9. 每次修改,如果不用git add到暂存区,那就不会加入到commit中。
  10. 用命令git checkout -- file,直接丢弃工作区的修改
  11. 要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git
  12. 使用命令git push -u origin master第一次推送master分支的所有内容(之后推送不需要添加-u参数);
  13. 使用命令git clone git@server-name:path/repo-name.git将github仓库的项目克隆至本地
  14. 使用命令git checkout -b dev来创建并切换到dev分支
  15. 使用命令git checkout name切换分支
  16. 使用命令git branch查看分支
  17. 使用命令git stash将当前工作临时存储起来
  18. 使用命令git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
  19. 使用命令git stash pop,恢复的同时把stash内容也删了;
  20. 查看远程库信息,使用git remote -v
  21. 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
  22. 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  23. 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
  24. 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
  25. 命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
  26. 命令git tag -a -m "blablabla..."可以指定标签信息;
  27. 命令git tag可以查看所有标签。

你可能感兴趣的:(编程相关工具,git,github)