前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Git使用教程

Git使用教程

作者头像
用户1203875
发布2018-06-19 17:34:42
1.7K0
发布2018-06-19 17:34:42
举报
文章被收录于专栏:Rovo89Rovo89

基础知识

什么是Git? Git 是一个命令行工具的集合,它可以帮你跟踪和记录文件的更改(源代码,图片等一切你想跟踪回访的)。有了它你可以恢复旧版本的项目,甚至可以比较、分析、合并和修改等。这个过程我们称为版本控制。除了Git之外,我们还有SVN,Mercurial,Perforce,CVS,Bitkeeper等,帮助我们实现版本控制

Git的特点? Git是分布式的,我们不需要一个主服务器来托管我们的项目的各个版本,相反,它是工作在你本地磁盘上的文件夹,这个存储着Git管理的项目的文件夹,我们称为repository。同时,你也可以把你的项目的副本放到线上,如Github或Gitlab,满足多人协作和项目代码共享的需要

安装Git

这里只列出macOS的安装,主要通过homebrew来安装

brew install git

如果你太新手的话,这里再推荐两个客户端软件,GitHub DesktopandSourcetree

配置Git

安装完成后,我们需要添加一些配置信息。其他Git有很多配置项需要去填写,这里我们就先去填写最重要的两项,user.nameuser.email

代码语言:javascript
复制
git config --global user.name "wwxd"
git config --global user.email wwxd@email.com

这里的"wwxd"wwxd@email.com需要换成你的

配置好这两项,这样每对Git操作一次都会带上上面你输入的信息,从而跟踪每次操作是谁在做 更多了解可以查看:here

创建Repository

上面我们已经提到了,Git管理和存储文件是在你磁盘的文件夹上进行的。在终端输入下面内容

代码语言:javascript
复制
cd ~/node
mkdir git-demo
cd git-demo
git init

git init这句命令会告诉Git这个文件夹是特别的,同时也会在该文件夹下再创建一个.git文件夹用来存储历史信息和配置信息

初始化后会有下面的信息显示

代码语言:javascript
复制
Initialized empty Git repository in /Users/wwxd/node/git-demo/.git/

说明我们的Git Repository已经创建完毕,不过里面是空的,我们需要创建一个文件hello.txt

查看Repo状态

git status可以帮助我们查看当前Repository的状态,包括哪些文件更新了,哪些是新添,哪些是被删除了等等

代码语言:javascript
复制
git status

On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    hello.txt

nothing added to commit but untracked files present (use "git add" to track)

这里返回的信息,就是上面我们添加的文件。这段信息告诉我们该文件是新的,但git还不知道是否需要去跟踪它还是要选择忽略它,所以我们进入 Git Staging 的学习

操作Stage状态

Git有一个“staging area”的概念。你可以把它想象为你的学生时期的书包,里面有各种作业本和书本(既是你的文件),这些作业本有些完成了作业,有些完成了一部分,有些还未做,甚至有些还是新的。你可以通过git add选择哪些作业本是需要提交的,这些被选择的作业本就进入了Stage状态,等待最后被git commit 如果选择其中一个文件,则如下

git add hello.txt

如果选择全部,则如下

git add -A

如果只选择修改过的文件,不包括新增的文件和还未commit过的文件,则如下

git add .

我们这里执行第一个选择,然后查看Git状态,如下

代码语言:javascript
复制
git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   hello.txt

发现Git已经知道了我们的hello.txt已经做好被提交上去的准备了

如果我们要取消hello.txt这个文件的Stage状态(取消add),则如下

git reset hello.txt

操作Commit状态

将Staging的项目commit一下,就是将当前项目所在的Repository给定一个时间点状态,同时还要加一段描述去简述这次的commit的内容,就像平时说的快照,我们可以随时回去看看它怎么样

代码语言:javascript
复制
git commit -m "Initial commit."

[master (root-commit) b1adc8d] Initial commit.
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 hello.txt

这句话的意思,跳过编辑器直接输入 commit简述,完成提交,并显示一些信息

我们还可以这样,如下

git commit -am "Initial commit." 这句话的意思是,先执行git add .再跳过编辑器直接输入 commit简述,完成提交

如果我们要修改上一次 commit 的简述,如下

git commit --amend

然后跳出编辑器,让你修改当前的简述

如果我们要取消刚刚的 commit ,但要保留修改过的文件或者项目,如下

git reset HEAD^ --soft

如果我们要回到上一次commit干净的状态,如下

git reset HEAD^ --hard

远程Repo

上面的基础知识是在本地上操作,所有的commit都是仅存在项目里的.git文件夹内。虽然本地的Repository是够用的,但大多数的情况下,我们需要共享或者部署我们的项目到线上,或者是托管到远程Repositories

连接远程Repo

这个时候,需要我们到Github上注册账号,然后在上面创建空的Repository,假设我们已经都注册好和创建好Repository

这个Repository的地址是https://github.com/xxx/xxx.git,这里的地址需要换成你自己的,这里只是作为教程使用

然后,打开终端输入 如下

git remote add origin https://github.com/xxx/xxx.git

一个项目可能有多个远程Repositories,为了区分不同的远程Repositories,我们就要给他们起不同的名字,这里的origin,就是这支Repositories的名字

上传到服务器

刚刚我们已经连上了远程Repositories,但上面还没有任何东西,需要我们把commit好的文件上传到远程Repositories

代码语言:javascript
复制
git push origin master

Counting objects: 3, done.
Writing objects: 100% (3/3), 211 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/xxx/xxx.git
 * [new branch]      master -> master

这里的git push还会要求你输入你的github的用户名和密码才能运行push

还有git push是带有两个参数,一个是远程Repo的名称(我们这里称为origin)和分支push(master是每个Repo的默认分支)

克隆Repo

上面我已经把本地的Repo上传到Github上了,别人就能在Github上查看和浏览Repo上的东西,甚至能克隆到他们自己的本地上,如下

git clone https://github.com/xxx/xxx.git Repo就会在本地上自动创建,且本地上Repo版本为Github上的版本

获取更新

你更新了Repo,别人可以通过git pull更新线上的Repo到自己的本地Repo

代码语言:javascript
复制
git pull origin master

From https://github.com/xxx/xxx
 * branch            master     -> FETCH_HEAD
Already up-to-date.

这里的pull指下载远程的Repo并且合并本地的Repo

同样地你可以这样获取别人的Repo Branches管理

当我们需要开发一个新的功能,最好的实践是复制原始项目,在其副本上完成开发,这个副本我们称为分支(Branches)。这条分支有自己的版本控制,每次的修改都会跟其他项目有所区分,直到你决定合并它们。

分支管理的好处:

  • 对于已经稳定工作的版本的代码将不会有任何影响
  • 多人协作共同开发
  • 开发者可以在自己的分支上完成开发,不会受他人的影响
  • 当不确定那个功能更好时,可以开出更多的分支,进行对比

创建分支

每一个Repo的默认分支都叫master,创建其他分支,使用git branch <name>,如下

git branch baranch-one

或者git checkout -b <name>

git checkout -b baranch-one

意思是创建该分支并且切换到该分支

至此,我们的baranch-one就创建完成,跟master分支上的版本一致

查看分支

列出所有本地branch

git branch

列出所有远程branch

git branch -r

列出所有本地以及远程branch

git branch -a

切换分支到baranch-one

git checkout baranch-one

合并分支

上面我们已经创建好分支baranch-one,需要我们选择该分支,然后进入,如下

代码语言:javascript
复制
git branch
baranch-one
* master

git checkout baranch-one 然后我们给该分支创建feature.txt,然后addcommit

代码语言:javascript
复制
touch feature.txt
git add feature.txt
git commit -m "New feature complete."

接着,我们需要切换master分支上

git checkout master

下面这步就是合并分支

git merge baranch-one

合并之后,原来的baranch-one已经不需要了,可以删除了,如下

git branch -d baranch-one

进阶教程

这部分可能会在我们的日常开发过程中用到,知道并且会用就可以了

检查commits

我们每一次的commit都有随机生成一个唯一id,它由一串数字和字母组成,如果要查看所有commit以及它的id,我们可以用git log,如下

代码语言:javascript
复制
git log

commit 108e80c5d06dc802c2000d7085dcd2bd4162e666
Author: Your Name <youname@mail.com>
Date:   Sun Feb 26 00:56:14 2017 +0800

    Initial commit.

如果要查看具体的某次commit,我们可以用git show [commit],如下

代码语言:javascript
复制
show 108e80c5

commit 108e80c5d06dc802c2000d7085dcd2bd4162e666
Author: Your Name <youname@mail.com>
Date:   Sun Feb 26 00:56:14 2017 +0800

    Initial commit.

diff --git a/hello.txt b/hello.txt
new file mode 100644
index 0000000..e69de29

如果要查看两次commit之间的不同,我们可以用 git diff [commit-from]..[commit-to],这里就不演示了

恢复文件

上面其实已经提到了,这里再补充说明

git checkout hello.txt

git checkout 108e80c5 hello.txt

这两个命令,前者是将hello.txt恢复到最近一次的commit状态,而后者则是指定恢复到某个commit的状态

处理合并冲突

很多时候,我们经常要进行多人协作,共同开发,我们不停地操作着创建分支合并分支。在这个过程中,就有可能会出现合并冲突。

让我们来看一下例子。首先我们创建了两个分支,分别叫branch-wwxdbranch-wwdx,都要在同一个文件中写一个函数来显示数组的所有元素

假设这个同一个文件为showarray.js branch-wwxd分支的写法,如下

代码语言:javascript
复制
// Use a for loop to console.log contents.
for(var i=0; i<arr.length; i++) {
    console.log(arr[i]);
}

branch-wwdx分支的写法,如下

代码语言:javascript
复制
// Use forEach to console.log contents.
arr.forEach(function(item) {
    console.log(item);
});

然后我们都对上面两个分支合并,然后就会报错

代码语言:javascript
复制
git checkout master
git merge branch-wwxd
git merge branch-wwdx

Auto-merging showarray.js
CONFLICT (content): Merge conflict in showarray.js
Automatic merge failed; fix conflicts and then commit the result.

然后我们打开showarray.js,发现

代码语言:javascript
复制
<<<<<<< HEAD
// Use a for loop to console.log contents.
for(var i=0; i<arr.length; i++) {
    console.log(arr[i]);
}
=======
// Use forEach to console.log contents.
arr.forEach(function(item) {
    console.log(item);
});
>>>>>>> wwdx's commit.

<<<<<<<HEAD=======之间是当前我们所在的分支的commit内容

=======>>>>>>> wwdx's commit.是我们要合并的branch-wwdx分支的内容

这个时候我们要做决定选择是两个都要留下,还是选择其中一个或者改成自己想要的内容,这里改成我们想要的内容

删除<<<<<<< HEAD>>>>>>> wwdx's commit.之间的内容,修改为

代码语言:javascript
复制
// Not using for loop or forEach.
// Use Array.toString() to console.log contents.
console.log(arr.toString());

将修正的文件加入到stage状态,然后重新commit一次,如下

代码语言:javascript
复制
git add showarray.js
git commit -m "Array printing conflict resolved."

合并冲突就此解决了。当我们发生冲突的时候,处理步骤如下

  • 将发生冲突的文件打开编辑,处理内容
  • 使用git add将处理好的文件加入stage
  • 重复上面两个步骤,直到所有冲突处理完毕
  • git commit提交,完成

配置 .gitignore

很多时候,我们并不需要所有文件都需要git add,尤其当我们使用git add -A的时候,这个命令是选择所有文件进入stage状态。有什么办法可以避免?那就是配置.gitignore文件 下面这些文件或者文件夹是可以被忽略

  • 日志文件(log)
  • 程序运行任务创建的文件夹
  • Node.js中的node_modules文件夹
  • IDE创建的文件
  • 和一些开发者自己的个人文件

根据上面的清单,我们可以修改.gitignore文件的内容为

代码语言:javascript
复制
*.log
build/
node_modules/
.idea/
my_notes.txt

总结

写了好久,自己也看了挺多资料,也算是一次大复习,另外,文章可能有错误,欢迎指正

Last modification:May 11th, 2018 at 12:26 pm

© The copyright belongs to the author

 Support

If you think my article is useful to you, please feel free to appreciate

×Close

Appreciate the author

Sweeping payments

 Pay by AliPay

 Pay by WeChat

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基础知识
  • 安装Git
  • 配置Git
  • 创建Repository
  • 查看Repo状态
  • 操作Stage状态
  • 操作Commit状态
  • 远程Repo
  • 连接远程Repo
  • 上传到服务器
  • 克隆Repo
  • 获取更新
  • 创建分支
  • 查看分支
  • 合并分支
  • 进阶教程
  • 检查commits
  • 恢复文件
  • 处理合并冲突
  • 配置 .gitignore
  • 总结
    • Appreciate the author
    相关产品与服务
    命令行工具
    腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档