Git学习


快速使用一遍Git管理项目文件,并理解Git是如何工作的

快速使用Git

下载安装Git

我使用的是ubuntu系统,在命令行下输入以下命令:

  sudo apt-get install git

因为之前装过Git,结果如下:
安装结果
输入以下命令查看当前版本号:

  git --version

Git版本

使用Git

首先创建一个文件夹

  mkdir ztypython

进入文件夹,在该目录下输入命令

  git init

此时Git帮我们创建了一个空的仓库,当前的文件夹里面多了一个 .git 的文件夹。git init这个命令是初始化的意思,使用该命令后,目录会生成一个 .git文件,该文件专门用来存放一些Git需要的数据和资源,用来管理当下的目录文件。
创建的文件夹
创建一个test.txt文件,输入以下命令查看状态

  git status


这里告诉我们处于master分支,并未提交文件。只有将文件add给git,它才能追踪。
Git对文件会划分三个状态:

1.工作区
文件修改了(存放新增和修改的文件)
2.暂存区
文件暂存了(存放下次要提交的文件)
3.git仓库
文件提交了(存放已经提交了的文件)

使用以下命令添加test.txt文件并查看状态

  git add test.txt
  git status


此时产生新文件test.txt
当使用"git add"这个命令的时候,其实就是把工作区里面新修改的文件标记下追踪,然后生成快照记录起来,放到暂存区里面,这并不是直接提交到Git仓库里面去

使用命令将文件提交给git管理

  git commit -m "add test.txt file"


此时成功将文件test.txt提交给git管理了
使用"git commit"这个命令,就是将暂存区里记录的文件存储到Git仓库里面。将项目push到远程服务器上。

Git工作流程

  • 在工作目录里新增或修改某文件
  • 对修改后的文件进行索引快照(git add)
  • 提交更新,将暂存区里的文件提交到Git仓库

更新时间:2019-07-26
Git常常用到的命令,以及Git添加错了、提交错了的解决方法

Git常常用到的命令

Git常用命令

git help 使用此命令可以列出所有git命令的解释
git命令解释
还可以单独查询某个命令的功能用法,如

 git help commit

git help commit

git log
历史提交记录
查看历史提交记录,使用该命令可以看到作者是谁,在什么时候提交了什么内容。还可以加入参数查看最近几条记录,如:git log -4 查看最近四条记录。在提交内容时使用命令 git commit -m "提交描述" 中要将提交描述写清楚,一遍在查询提交记录时方面查看

提交错误解决

<font color="blue" size="4">git提交错误
使用命令:

 git commit --amend

比如在ztypython文件目录下新建一个test2.txt文件,将其添加进缓存区,提交到仓库。但是在提交的描述信息中将test2.txt写错为test1.txt,此时可用此git commit --amend 命令修改提交描述。

在使用 git commit --amend 命令后出现以下窗口,可修改信息,保存退出即可。

这时用 git log 查看提交记录,发现已经将test1.txt改为了test2.txt

<font color="blue" size="4">提交时漏掉文件
在我们本要提交两个文件test3.txt和test4.txt,但提交时漏掉一个这种情况下

使用以下代码:

 git add test4.txt
 git commit --amend


将遗漏的文件test4.txt添加进缓存区,补交进仓库

<font color="blue" size="4">一次性添加所有文件
当工作目录中有很多文件需要添加的时候,可以用"."来代替所有文件
比如现在又新建了两个文件test5.txt和test6.txt,使用以下命令将两个文件一起加入

 git add .

一次性添加文件

<font color="blue" size="4">撤销添加的文件

若此时发现test6.txt不是想要添加的文件,使用以下命令来撤销这个文件的添加

 git reset HEAD test6.txt


可以看到,test6.txt已经从暂存区移除了。


更新时间:2019-07-28
Git分支的概念,和git分支的创建、切换、状态等

Git分支的理解应用

git分支的理解

在使用命令 git log 的时候,我们看到:

这里的 HEAD -> master 中的 master 就是一个分支,通常来说,它是我们默认的分支,是一个主分支。接下来进一步理解这个概念。
假如此时创建了一个Git项目,以ztypython为例

接着在这个项目添加了文件,然后做了第一次 commit 提交:

可以看到,第一次提交的时候,在 commit 有了一个 commit id ,master 分支指向了这个 commit 对象。当进行第二次提交的时候:

第二次提交的 commit 对象有了第一次提交的 commit 对象指针,master 分支指向了第二次 commit 的对象了,也就是说,当前的分支,指向的就是最后一次提交的 commit 对象。那么我们提交了新的文件也是一个道理。这就是每次提交的流程,所处在的当前分支,总会随着提交而移到最后一个 commit 对象,而新的 commit 对象总会有指针指向 【父commit】 对象(也就是指针指向前一个commit对象。可以把 HEAD 当做是你当前这个分支的头,头在哪里,当前的分支就在哪里。现在只有 master 这个分支,所以我们的 HEAD 这个头自然也落在 master 这个分支上。

Git分支的创建

使用命令 git branch 可以查看当前的分支情况

可以看到,现在只有一个 master 分支,在 master 前面有一个 * 号,说明当前处于 master 这个 branch 上。

假如做了三次提交

此时再创建一个新的分支 ztyang

git branch ztyang


现在新的分支指向了最后一个 commit 对象
再次使用 git branch 这个命令来看看 git 项目的分支情况:

现在这个项目就有两个分支了,不过这个 * 还是指向了 master 这个分支,也就是上图中这个 HEAD 依然是指向 master 的,HEAD 指向哪里就说明当前所处的分支在哪里。

Git分支的切换

若想从 master 分支切换到 ztyang 分支上,使用命令:

git checkout ztyang


现在这颗 * 指向了 ztyang 这个分支,也就是说,现在 HEAD 指向了 ztyang 这个分支了:

Git分支的测试

在当前分支 ztyang 下添加文件 ztyang_file.txt 并提交:

touch ztyang_file.txt
git add ztyang_file.txt
git commit -m "add ztyang_file.txt"



master 分支还是停留在切换前的 commit 对象,而现在所处的 ztyang 分支已经指向新提交的 commit 对象了。
来看一下当前分支下的文件内容:

切换回 master 分支上

git checkout master


可以看到,在 master 分支上就没有 ztyang_file.txt 这个文件了,因为它还是停留在我们切换 ztyang 前的 commit 对象上。下图处于 master 分支指向的位置:

若在当前 master 分支下做了提交,会变成这样:


模拟Git使用场景

假如现在某个团队需要用 git 来共同协作完成一个游戏项目,每个人需要分别负责好自己的功能,创建自己的分支来写各自的代码。

对于项目一开始的一些初始化的操作,可以使用 master 主分支来完成,但是 master 分支通常情况下不直接拿来开发,之所以它是主分支,就是用来合并其它分支的。也就是说,当要开发具体功能的时候,不要直接在 master 下开发,应该新建一个分支出来,开发完成了之后,再合并到 master 分支上去。

现在开始创建了项目 games ,并且使用 git 初始化:

接着创建一些必要的文件,比如 code 文件夹用来存放代码, images 文件夹用来存放图片, data 文件夹用来存放数据:

接着在各个文件添加一些初始化的文件数据,比如在 code 文件夹下添加了一些代码底层结构(这里就以创建一个 init 文件来举例),然后做了提交:

接着在 images 中存放一些必要的公用图片素材,然后做了提交:

接着又创建了数据库,提交:

至此,在 master 分支上做了三次提交,如下图所示:

假如现在某人需要负责一个功能 feature_1 ,于是开始在master下创建一个新的分支,准备开始工作:

此时创建了feature_1分支并且切换到了该分支下,这里有个小技巧,使用命令:

git checkout -b feature_1

直接创建了新分支并且切换了过去,就不用打两次命令了。

现在开始在该分支下写代码并提交:

就在这个时候,发现刚刚在 master 上做的操作有一个 BUG ,需要需要紧急修复好这个 BUG ,这时候你应该怎么办呢?

  • 1、切换回 master 分支上
  • 2、创建修复的分支修复bug
  • 3、将修复好的分支合并到主分支上
  • 4、合并到主分支上后,修复分支没用,把它删除

现在切换到主分支,创建新的分支:

现在所处的位置是这样的:

现在开始修复bug:

现在变成了这样:

接下来合并分支,需要先切换到 master 分支上,然后使用 merge 命令来合并 fixbug 分支,把修复好的代码合并到 master 上去。

这时候变成这样:

也就是说,现在处于 master 上,并且 master 已经有了修复好的代码了。那么此刻 fixbug 这个分支就没什么用了,直接删除它:

ok,现在可以切换到 feature_1 专心写代码了。


更新时间:2019-08-14
git分支的暂存以及git分支合并时冲突的解决方案

Git分支的暂存及冲突解决方案

git分支的暂存

以下图所示状态为例:

就是已经在 master 分支上合并好了修复的分支了,此时可以切换回 feature_1 这个分支上继续工作:

现在开始在 code 文件夹中写代码,比如在 feature_1.py 中写了如下代码:

而这时,需要切换回 master 分支上去解决新发现的bug,此时代码没写完,又不好直接 commit 提交(最好每次提交都要完成好一个版本再提交,以免产生过多的垃圾 commit )。若此时就将代码放在 feature_1 分支上,直接切换回 master 分支上:

报错:你现在 feature_1 这个分支有东西没提交,只能先提交了才能切换。可是此时代码并没有完成不能提交。

这个时候就要用到 git 的暂存功能了,暂存就是先把没写完的代码先暂存起来,等需要的时候再回来拿,暂存了之后,就算没有提交当前的代码, git 也不会发现还有东西没提交,那么就自然而然的可以切换到 master 分支上去了。

使用命令 git stash 来实现暂存:
git stash

暂存了之后就可以成功切换回 master 分支了:

然后开始在 master 分支上新建修复 bug 的分支,搞了一阵之后修复完合并好了,最后切换回 feature_1 分支上继续写刚刚没写完的代码,于是切换回了 feature_1 这个分支继续刚才没完成的代码:

发现,刚刚写的代码不见了:

不慌,使用命令 git stash apply 回复刚刚写的代码:
git stash apply

再次用 vim 编辑器打开刚刚的代码文件,发现代码已经成功恢复:

如果你暂存多次,那么你就可以通过 git stash list 来查看
恢复的时候用 git stash apply 就可以恢复最近的一个暂存记录,如果想恢复指定的也可以,使用 git stash apply stash@{1} ,也就是在 apply 后面加上指定的 stash 编号就可以了。

git合并时冲突的解决方案

在进行不同的分支操作的时候,最后都要回到 master 分支来合并,那么在合并的过程中不会总是一帆风顺的,因为总有这样那样的小麻烦,所以要做好应付,接下来就是在合并的过程中产生冲突的解决。

现在模拟一下出现冲突的情况。创建一个 git 项目 ztyang:

现在默认在 master 分支上,假设现在 git 项目有一个代码文件,叫做 hello.py ,这个文件里面有一些初始化的代码:

这时候有两个人M,N接到了这个项目,要共同协作。于是M创建了A分支,N创建了B分支:

由于事先没有好好沟通,两人同时在 hello.py 文件中写了代码:


N并不知道M也在这个文件写了代码,他也在这个文件里写了代码:


两人都在hello.py中写了代码,准备切换到 master 分支合并它们:
切换回master分支

合并M的A分支:

这个时候挺顺利,于是开始合并N的B分支:

这个时候发现合并不了,说 hello.py 有冲突,请解决冲突再提交,打开 hello.py 看看:

可以看到,M和N同时在这个文件做了操作。图中的“=========”符号是用来区分不同分支的内容。在 “=========” 以上就是 (HEAD指向)master 分支上的内容, 而在 “=========” 以下就是(指向) B 分支的内容。

那么这时候知道分别是谁写的内容之后,就可以进一步讨论,看哪个是对的就用谁的,比如 N 的代码是可以保留的,删除 M 的代码:

保存后提交,就解决了冲突,并且可以将最终的结果合并到主分支上了。


Github的功能

Github 是一个基于 git 的版本控制软件源代码服务,在这里我们可以创建公开的或者私有的代码仓库,从而方便地进行远程托管项目。GitHub 已然成为全世界的程序员聚集之地,在这里我们可以发现许多出名的开源项目,也可以和别人一起合作。

先看一段视频

Github的作用

1、 可以将自己的项目托管到 GitHub 上面去,这样本地的存储的代码文件即使出现问题了了,也可以通过 GitHub 轻松获取回来,而且在 GitHub 托管公开项目是免费的。

2、可以在上面使用一些简单的操作就能够获取到别人优秀的源代码,而且还可以和别人一起在上面协作,可以很方便地看到整个项目的动态,比如你提交了啥,这个项目的合作用户都有谁,一目了然。

3、还可以在上面托管博客、静态网站,在 GitHub 这里,免费提供空间和域名。创建博客不用另外买服务器和域名。

Github各个模块的功能

首先得自己注册Github
Github首页

  • 最左边显示的就是你自己在 GitHub 创建的项目
  • 中间一栏就是动态,你关注了什么人,关注了什么项目,还有你自己创建的东西,一有动态就会在这里显示出来+ 右边一栏就是推荐的一些比较火的开源项目
  • 左上角就是 GitHub 的搜索:
    搜索

在这里可以通过关键词来搜索你想要看s到的开源项目:

你还可以进一步根据条件搜索,比如左上角的东西,你点击 Code 就是搜索含有 Python 关键词的代码, Commits 就是搜索含有 Python 关键词的提交…..,你还可以通过不同的条件进行排序:

  • 最上面的菜单栏

Issues
通过 Issue 功能,可以给开源项目的作者进行反馈,例如你发现这个项目有 Bug ,或者有些功能可以做的更好,那么就可以新建一个 Issue 给对方一个建议

进入开源项目,可以看到 Code 的旁边有个 Issues 菜单,点进去可以看到一些别人提过的问题和已经被解决了的问题,如果你在这个项目中也遇到了别人没有遇到的问题,那么你就可以对作者提出 issue ,点击右边的 New issue 按钮即可
把你的描述写清楚之后,点击提交,作者就会收到你的信息。当作者收到 issue 之后,解决完就可以将其 close 掉,代表已经解决了相应的 bug 或者问题

Pull requests
如果在 GitHub 上 Fork 了别人的项目,并在此之上进行了代码优化,或者添加了新的功能,或者解决了项目存在的 bug,你希望原作者将你的代码合并到他的项目中去。那么我们就可以给原作者一个 Pull Request ,请求合并。

Marketplace 点进去是这样的:

这里面是 GitHub 里面的一些优秀的开源工具,可以把它理解为 AppStore 或者 Android 市场。
而 explore 这个菜单进去,展示的就是一些你感兴趣的项目, GitHub 的热门项目,你关注的主题项目等:

  • 右边的铃铛是消息提醒的,旁边的 + 号主要是用来创建项目相关的
  • 最右边有你的头像,点击你的头像,可以看到一个下拉菜单,点一下 Your profile 进入,可以看到以下的画面,这个是用户的主要页面,当我们去访问别人的时候,我们主要看到的就是这样的页面:

更新时间:2019-08-16
Github创建、配置、授权、克隆、推送、Star、Fork、Watch、Gist、pull、Follow

Github的基本操作

创建

进入 GitHub 的官网,点击菜单栏右边的 + 号,选择 New repository :

接着会出现这个面板:

填写一下表单消息,Repository name 就是填写仓库的名称,Description 写你这个仓库的描述 ,接着可以选择这个项目是 public 还是 private ,选择 Public 别人就能看到你的项目,选择 private 就只有你自己才能看到
,Initialize this repository with a README 就是要不要在你的仓库初始化一个 README 文件,这个文件主要是来说明仓库是干嘛用的,用的是 Markdown 语言。

下面这个:

左边这个是问要不要添加 gitignore ,这个主要是来忽略项目中一些文件的,右边的 LICENSE 就是要给的仓库添加什么样的证书,这样别人用你开源的项目要遵循你这个证书的规则。

创建完成后是这样:

远程仓库创建好了。
点击右边的 Clone or down 按钮可以看到项目的远程地址:

克隆

复制一下远程地址,用 git clone 命令把项目克隆到本地:

其实使用 git clone 的意思就是将远程的 master 分支下的内容拉取下来,然后本地创建一个 master 分支来对项目进行跟踪。

现在对项目做一个提交,随便添加点东西,比如在 README 文件中编辑点东西:

提交:

推送

使用 git push 命令将提交推送到远程分支上去:

其中的 origin 就是远程的名称,master 就是分支名称。使用 git remote -v 可查看远程名称:

这样,就成功地把本地的更新提交到 GitHub 上去了。不过,如果是第一次这么操作,会遇到些许麻烦,那就是,GitHub 不知道你是谁, Git 不知道你是谁,所以需要登录、配置一下。

配置

配置一下 GitHub 用户名和邮箱:

# 配置用户名:
  git config -global user.name "用户名"
# 配置邮箱
  git config -global user.email "邮箱"

授权

接着要进行 ssh GitHub 授权:
GitHub 设立了安全的机制,并不是每一个终端都可以直接提交代码到 GitHub 的,需要本地代码和 GitHub 进行 ssh 授权才可以提交代码。
首先需要在本地生成 rsa 秘钥,接着输入如下命令:

ssh-keygen -t rsa


这时候生成了相应的私钥和公钥,并且保存到相应的目录下。

打开 id_rsa.pub 公钥文件,将里面的内容复制,接着打开 GitHub ,在右上角的头像下选择 Settings 按钮,选择 “SSH and GPG keys” :

title 可以随便写,而 key 就是你刚刚复制的 id_rsa.pub 公钥内容:

添加即可

Star

当在 GitHub 上面发现一些不错的开源项目时,可以对其 Star ,点击右上角的 Star 按钮:

相当于将喜欢的项目收藏到你的账户里。下次想看收藏的项目就可以点击右上角的头像,选择 “Your stars” 即可查看

Fork

可以把 Fork 操作理解为 “复制” ,当看到非常感兴趣的项目,想要对这个开源项目添加功能或者修改,那么可以使用 Fork :

当对项目进行 Fork 的时候,你 GitHub 上面的仓库里就会有一个和 Fork 的一模一样的项目,并且相互独立,不会影响到之前的项目。

点击 Fork 之后,就可在右上角点击头像,选择 “Your profile” ,在这里会发现,除了自己创建的项目之外,你 Fork 的项目也会出现在这里,你可以对其操作,就像是你自己的项目一样。

Watch

在 GitHub 上 Watch 了某个项目,就相当于监听,也就是你关注了这个开源项目,这个项目如果有什么改动或者提交的动态,GitHub都会给你推送这个项目的最新消息。

Gist

代码片段,如果只想单纯地分享代码片段,而不是整个项目,可以新建一个 Gist ,可以在右上角的 + 选择 “New gist” 进行创建:

当创建完代码片段之后就可以在你右上角的头像,点击选择 “Your gists” 查看了

pull

在团队中和他人合作项目开发的时候,别的小伙伴将他们的代码 push 到 GitHub 上面去之后,我们想要获取下来,就可以使用 pull 命令了,比如我们从远程的 master 分支上获取最新的代码:

git pull origin master

Fellow

Follow就是关注,像微博一样,你看到你喜欢的作者,可以进入他的主页 Follow 他

https://file.ztongyang.cn/yang/picttures/QQqr.jpg https://file.ztongyang.cn/yang/picttures/wechatqr.png https://metu.ztongyang.cn/a/avatar.jpg avatar

南玖

生命不息,折腾不止

  网站咨询
  •   当前在线1人
  •   加载耗时63 ms
  •   文章数目40篇
  •   分类总数10个
  •   评论总数58条
  •   站点字数3.84 W
  •   运行时间90天
  访问信息
  •   
  •   2020-10-23 13:52:31 Fri
  •   ?浏览器
  •   操作系统
  热门文章