[转] Git使用教程 -- 新手向
Git使用教程
Published on Feb 26, 2017 in Tutorials with 8 comments
教程 Git Github
是的,这跟上一篇文章一样同是新手向教程,主要记录我常用的Git操作和一些使用技巧和注意事项,希望可以帮到你。
这篇教程需要读者懂点Command Line,不懂的话可以看一下我另外一篇文章:here
基础知识
什么是Git?
Git 是一个命令行工具的集合,它可以帮你跟踪和记录文件的更改(源代码,图片等一切你想跟踪回访的)。有了它你可以恢复旧版本的项目,甚至可以比较、分析、合并和修改等。这个过程我们称为版本控制。除了Git之外,我们还有SVN,Mercurial,Perforce,CVS,Bitkeeper等,帮助我们实现版本控制
Git的特点?
Git是分布式的,我们不需要一个主服务器来托管我们的项目的各个版本,相反,它是工作在你本地磁盘上的文件夹,这个存储着Git管理的项目的文件夹,我们称为repository。同时,你也可以把你的项目的副本放到线上,如Github或Gitlab,满足多人协作和项目代码共享的需要
安装Git
这里只列出macOS的安装,主要通过 homebrew 来安装
brew install git
如果你太新手的话,这里再推荐两个客户端软件,GitHub Desktop and Sourcetree
配置Git
安装完成后,我们需要添加一些配置信息。其他Git有很多配置项需要去填写,这里我们就先去填写最重要的两项,user.name
和 user.email
打开终端,输入下面内容
git config --global user.name "Chakhsu Lau"
git config --global user.email chakhsu@email.com
这里的"Chakhsu Lau"
和chakhsu@email.com
需要换成你的
配置好这两项,这样每对Git操作一次都会带上上面你输入的信息,从而跟踪每次操作是谁在做
更多了解可以查看:here
创建Repository
上面我们已经提到了,Git管理和存储文件是在你磁盘的文件夹上进行的。在终端输入下面内容
cd ~/node
mkdir git-demo
cd git-demo
git init
git init
这句命令会告诉Git这个文件夹是特别的,同时也会在该文件夹下再创建一个.git
文件夹用来存储历史信息和配置信息
初始化后会有下面的信息显示
Initialized empty Git repository in /Users/chakhsu/node/git-demo/.git/
说明我们的Git Repository已经创建完毕,不过里面是空的,我们需要创建一个文件hello.txt
touch hello.txt
查看Repo状态
git status
可以帮助我们查看当前Repository的状态,包括哪些文件更新了,哪些是新添,哪些是被删除了等等
git statusOn branch masterInitial commitUntracked files:(use "git add <file>..." to include in what will be committed)hello.txtnothing 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状态,如下
git status
On branch masterInitial commitChanges 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的内容,就像平时说的快照,我们可以随时回去看看它怎么样
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/chakhsu/lilicia.git
,这里的地址需要换成你自己的,这里只是作为教程使用
然后,打开终端输入 如下
git remote add origin https://github.com/chakhsu/lilicia.git
一个项目可能有多个远程Repositories,为了区分不同的远程Repositories,我们就要给他们起不同的名字,这里的origin
,就是这支Repositories的名字
上传到服务器
刚刚我们已经连上了远程Repositories,但上面还没有任何东西,需要我们把commit好的文件上传到远程Repositories
git push origin masterCounting 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/chakhsu/lilicia.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/chakhsu/lilicia.git
Repo就会在本地上自动创建,且本地上Repo版本为Github上的版本
获取更新
你更新了Repo,别人可以通过git pull
更新线上的Repo到自己的本地Repo
git pull origin masterFrom https://github.com/chakhsu/lilicia* 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
,需要我们选择该分支,然后进入,如下
git branch
baranch-one
* master
git checkout baranch-one
然后我们给该分支创建feature.txt
,然后add
和commit
它
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
,如下
git logcommit 108e80c5d06dc802c2000d7085dcd2bd4162e666
Author: Your Name <youname@mail.com>
Date: Sun Feb 26 00:56:14 2017 +0800Initial commit.
如果要查看具体的某次commit,我们可以用git show [commit]
,如下
git show 108e80c5commit 108e80c5d06dc802c2000d7085dcd2bd4162e666
Author: Your Name <youname@mail.com>
Date: Sun Feb 26 00:56:14 2017 +0800Initial 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-chakhsu
和branch-ping
,都要在同一个文件中写一个函数来显示数组的所有元素
假设这个同一个文件为showarray.js
branch-chakhsu
分支的写法,如下
// Use a for loop to console.log contents.
for(var i=0; i<arr.length; i++) {console.log(arr[i]);
}
branch-ping
分支的写法,如下
// Use forEach to console.log contents.
arr.forEach(function(item) {console.log(item);
});
然后我们都对上面两个分支合并,然后就会报错
git checkout master
git merge branch-chakhsu
git merge branch-pingAuto-merging showarray.js
CONFLICT (content): Merge conflict in showarray.js
Automatic merge failed; fix conflicts and then commit the result.
然后我们打开showarray.js
,发现
<<<<<<< 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);
});
>>>>>>> Ping's commit.
<<<<<<< HEAD
和=======
之间是当前我们所在的分支的commit内容
=======
和>>>>>>> Ping's commit.
是我们要合并的branch-ping
分支的内容
这个时候我们要做决定选择是两个都要留下,还是选择其中一个或者改成自己想要的内容,这里改成我们想要的内容
删除<<<<<<< HEAD
和>>>>>>> Ping's commit.
之间的内容,修改为
// Not using for loop or forEach.
// Use Array.toString() to console.log contents.
console.log(arr.toString());
将修正的文件加入到stage状态,然后重新commit一次,如下
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
文件的内容为
*.log
build/
node_modules/
.idea/
my_notes.txt
总结
写了好久,自己也看了挺多资料,也算是一次大复习,另外,文章可能有错误,欢迎指正
这里再列出编写这篇教程发现到资料,希望能帮到你
Git官方文档:here
Git的客户端:here
GitHub Git 备忘单:here
GitHub 练习小游戏:here
.gitignore
在线生成器:here
教程编写结合了实践和参考了下面文章
tutorialzine.com/2016/06/learn-git-in-30-minutes/
blog.gogojimmy.net/2012/01/21/how-to-use-git-2-basic-usage-and-worflow/
转自:Git使用教程
本文由 Chakhsu Lau 创作,采用 知识共享署名4.0 国际许可协议进行许可
[转] Git使用教程 -- 新手向相关推荐
- 廖雪峰Git简明教程整理
廖雪峰Git简明教程 声明:本教程完全搬运自廖雪峰老师的个人网站,仅限于学习使用.所有版权归廖雪峰老师所有.整理人为Megatron,如果侵权请联系本人zhangwz93@foxmail.com删除. ...
- 如何团队协作,代码托管?Git使用教程:最详细、最浅显、一文读懂Git常用操作!...
点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 作者:涂根华 来源:www.cnblogs.com/tugenhua0707 Git使 ...
- Git基础教程(二)
继续上篇Git基础教程(一),在开篇之前,先回顾一下上篇中的基本命令. 1 配置命令:git config --global * 2 版本库初始化:git init 3 向版本库添加文件:git ad ...
- Git篇——Git使用教程
Git篇--Git使用教程 摘要 1. Git工作区域 1.1 工作区(Working Directory) 1.2 暂存区 1.3 Git Repository(Git 仓库) 2. 向仓库中添加文 ...
- Git学习教程(一):git简介
转自:http://fsjoy.blog.51cto.com/318484/244397 第一课. git简介 内容:什么是git,为什么要使用git以及获取和学习git的途径. 欢迎来到github ...
- 痞子衡嵌入式:第一本Git命令教程(0)- 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家讲的是Git命令汇编,共12篇文章,循序渐进地介绍Git操作的完整过程. 在开始Git课程之前,需要先跟大家普及2个重要概念(四度空间.四种状 ...
- (转载)Git使用教程:最详细、最傻瓜、最浅显、真正手把手教!
转载自 Git使用教程 预警:因为详细,所以行文有些长,新手边看边操作效果出乎你的预料) 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 工作原理 / 流程: Workspace: ...
- Git使用教程:最详细、最傻瓜、最浅显、真正手把手教
转载自 Git使用教程:最详细.最傻瓜.最浅显.真正手把手教 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 工作原理 / 流程: Workspace:工作区 Index / ...
- [Git高级教程 (一)] 通过 Tag 标签回退版本修复 bug
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1 前言 本系列之所以取名"Git高级教程",主要是教大家解决实际工作中遇到的问 ...
最新文章
- 嵌入式linux的调试时间,嵌入式LINUX启动时间优化
- PostgreSQL — 常规操作
- 笔记-中项案例题-2017年下-收尾管理
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)
- Sublime Text 3 插件安装及Vim 模式设置
- SPSS安装以及如何解决can not create java virtual machine问题
- 对抗样本(三)FGSM
- 毕业论文系列-公式编号-等号对齐及编号
- linux修改文件类型和权限
- 题9.6:13个人围成一圈, 从第1个人开始顺序报号1, 2, 3。凡报到3者退出圈子。找出最后 留在圈子中的人原来的序号。要求用链表实现。
- tp中ueditor编辑器的使用
- Linux进阶 | Docker部署nginx的web服务,VOLUME的使用详解,实现数据持久化!
- springmvc java.lang.IllegalStateException: getOutputStream() has already been called for this respon
- 国家进口的爱乐维与德国药店的爱乐维的区别
- oracle.简单查询、排序、限定查询、单行函数
- Spring -- 迈向Spring之路
- 华为携手6家鸿蒙生态合作伙伴共同探讨未来科技蓝图
- CH376的串口模式操作U盘(读、写、txt文件、csv文件、串口调试讲解、stm32程序)
- cannot coerce class ‘“igraph“’ to a data.frame
- 三坐标测量仪测针选择和校准时,需注意的问题!!!