是的,这跟上一篇文章同样同是新手向教程,主要记录我经常使用的Git操做和一些使用技巧和注意事项,但愿能够帮到你。html
这篇教程须要读者懂点Command Line,不懂的话能够看一下我另一篇文章:herenode
什么是Git?
Git 是一个命令行工具的集合,它能够帮你跟踪和记录文件的更改(源代码,图片等一切你想跟踪回访的)。有了它你能够恢复旧版本的项目,甚至能够比较、分析、合拼和修改等。这个过程咱们称为版本控制。除了Git以外,咱们还有SVN,Mercurial,Perforce,CVS,Bitkeeper等,帮助咱们实现版本控制git
Git的特色?
Git是分布式的,咱们不须要一个主服务器来托管咱们的项目的各个版本,相反,它是工做在你本地磁盘上的文件夹,这个存储着Git管理的项目的文件夹,咱们称为repository。同时,你也能够把你的项目的副本放到线上,如Github或Gitlab,知足多人协做和项目代码共享的须要github
这里只列出macOS的安装,主要经过 homebrew 来安装数组
brew install git
若是你太新手的话,这里再推荐两个客户端软件,GitHub Desktop and Sourcetreebash
安装完成后,咱们须要添加一些配置信息。其余Git有不少配置项须要去填写,这里咱们就先去填写最重要的两项,user.name
和 user.email
服务器
打开终端,输入下面内容编辑器
git config --global user.name "My Name" git config --global user.email myEmail@example.com
配置好这两项,这样每对Git操做一次都会带上上面你输入的信息,从而跟踪每次操做是谁在作分布式
更多了解能够查看:hereide
上面咱们已经提到了,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
git status
能够帮助咱们查看当前Repository的状态,包括哪些文件更新了,哪些是新添,哪些是被删除了等等
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 的学习
Git有一个“staging area”的概念。你能够把它想象为你的学生时期的书包,里面有各类做业本和书本(既是你的文件),这些做业本有些完成了做业,有些完成了一部分,有些还未作,甚至有些仍是新的。你能够经过git add
选择哪些做业本是须要提交的,这些被选择的做业本就进入了Stage状态,等待最后被git commit
若是选择其中一个文件,则以下
git add hello.txt
若是选择所有,则以下
git add -A
若是只选择修改过的文件,不包括新增的文件和还未commit过的文件,则以下
git add .
咱们这里执行第一个选择,而后查看Git状态,以下
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
将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
上面的基础知识是在本地上操做,全部的commit都是仅存在项目里的.git
文件夹内。虽然本地的Repository是够用的,但大多数的状况下,咱们须要共享或者部署咱们的项目到线上,或者是托管到远程Repositories
这个时候,须要咱们到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 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/chakhsu/lilicia.git * [new branch] master -> master
这里的git push
还会要求你输入你的github的用户名和密码才能运行push
还有git push
是带有两个参数,一个是远程Repo的名称(咱们这里称为origin)和分支push(master是每一个Repo的默认分支)
上面我已经把本地的Repo上传到Github上了,别人就能在Github上查看和浏览Repo上的东西,甚至能克隆到他们本身的本地上,以下
git clone https://github.com/chakhsu/lilicia.git
Repo就会在本地上自动建立,且本地上Repo版本为Github上的版本
你更新了Repo,别人能够经过git pull
更新线上的Repo到本身的本地Repo
git pull origin master From https://github.com/chakhsu/lilicia * branch master -> FETCH_HEAD Already up-to-date.
这里的pull指下载远程的Repo而且合并本地的Repo
一样地你能够这样获取别人的Repo
当咱们须要开发一个新的功能,最好的实践是复制原始项目,在其副本上完成开发,这个副本咱们称为分支(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
这部分可能会在咱们的平常开发过程当中用到,知道而且会用就能够了
咱们每一次的commit都有随机生成一个惟一id,它由一串数字和字母组成,若是要查看全部commit以及它的id,咱们能够用git log
,以下
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]
,以下
git 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-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-ping Auto-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
提交,完成
不少时候,咱们并不须要全部文件都须要git add
,尤为当咱们使用git add -A
的时候,这个命令是选择全部文件进入stage状态。有什么办法能够避免?那就是配置.gitignore
文件
下面这些文件或者文件夹是能够被忽略
日志文件(log)
程序运行任务建立的文件夹
Node.js中的node_modules
文件夹
IDE建立的文件
和一些开发者本身的我的文件
根据上面的清单,咱们能够修改.gitignore
文件的内容为
*.log build/ node_modules/ .idea/ my_notes.txt
写了很久,本身也看了挺多资料,也算是一次大复习,另外,文章可能有错误,欢迎指正
这里再列出编写这篇教程发现到资料,但愿能帮到你
教程编写结合了实践和参考了下面文章
tutorialzine.com/2016/06/learn-git-in-30-minutes/
blog.gogojimmy.net/2012/01/21/how-to-use-git-2-basic-usage-and-worflow/
欢迎访问个人博客:https://www.linpx.com/