GIT

git tag — 标签相关操作

标签可以针对某一时间点的版本做标记,常用于版本发布。 列出标签 $ Git tag # 在控制台打印出当前仓库的所有标签 $ git tag -l ‘v0.1.*’ # 搜索符合模式的标签 打标签 git标签分为两种类型:轻量标签和附注标签。轻量标签是指向提交对象的引用,附注标签则是仓库中的一个独立对象。建议使用附注标签。 # 创建轻量标签 $ git tag v0.1.2-light # 创建附注标签 $ git tag -a v0.1.2 -m “0.1.2版本” 创建轻量标签不需要传递参数,直接指定标签名称即可。 创建附注标签时,参数a即annotated的缩写,指定标签类型,后附标签名。参数m ...

git stash — 暂存临时代码

stash命令可以很好的解决这样的问题。当你不想提交当前完成了一半的代码,但是却不得不修改一个紧急Bug,那么使用’Git stash’就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修 Bug,等到修完Bug,提交到服务器上后,再使用’git stash apply’将以前一半的工作应用回来。 当你多次使用’git stash’命令后,你的栈里将充满了未提交的代码,这时候你会对将哪个版本应用回来有些困惑,’git stash list’命令可以将当前的Git栈信息打印出来,你只需要将找 ...

git stash — 暂存临时代码

stash命令可以很好的解决这样的问题。当你不想提交当前完成了一半的代码,但是却不得不修改一个紧急Bug,那么使用’Git stash’就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修 Bug,等到修完Bug,提交到服务器上后,再使用’git stash apply’将以前一半的工作应用回来。 当你多次使用’git stash’命令后,你的栈里将充满了未提交的代码,这时候你会对将哪个版本应用回来有些困惑,’git stash list’命令可以将当前的Git栈信息打印出来,你只需要将找 ...

git tag — 标签相关操作

  标签可以针对某一时间点的版本做标记,常用于版本发布。 列出标签 $ git tag # 在控制台打印出当前仓库的所有标签 $ git tag -l ‘v0.1.*’ # 搜索符合模式的标签 打标签 git标签分为两种类型:轻量标签和附注标签。轻量标签是指向提交对象的引用,附注标签则是仓库中的一个独立对象。建议使用附注标签。 # 创建轻量标签 $ git tag v0.1.2-light # 创建附注标签 $ git tag -a v0.1.2 -m “0.1.2版本” 创建轻量标签不需要传递参数,直接指定标签名称即可。 创建附注标签时,参数a即annotated的缩写,指定标签类型,后附标签 ...

Git fetch和git pull的区别

Git中从远程的分支获取最新的版本到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge      git fetch origin master git log –p master..origin/master git merge origin/master 以上命令的含义: 首先从远程的origin的master主分支下载最新的版本到origin/master分支上 然后比较本地的master分支和origin/master分支的差别 最后进行合并 上述过程其实可以用以下更清晰的方式来进行: git fetch origin master:tmp git diff tmp  git merge tmp 从远程获取最新的版本到本地的test分支上 ...

使用git pull文件时和本地文件冲突怎么办?

使用git pull代码时,经常会碰到有冲突的情况,提示如下信息: error: Your local changes to 'c/environ.c' would be overwritten by merge. Aborting. Please, commit your changes or stash them before you can merge. 这个意思是说更新下来的内容和本地修改的内容有冲突,先提交你的改变或者先将本地修改暂时存储起来。 处理的方式非常简单,主要是使用git stash命令进行处理,分成以下几个步骤进行处理。 1、先将本地修改存储起来 $ git stash 这样本地的所有修改就都被暂时存储起来 。是用git stash list可以看到保存的信 ...

git 查看远程分支、本地分支、删除本地分支

1 查看远程分支 1 2 3 4 5 6 7 8 $ git branch -a * br-2.1.2.2 master remotes/origin/HEAD -> origin/master remotes/origin/br-2.1.2.1 remotes/origin/br-2.1.2.2 remotes/origin/br-2.1.3 remotes/origin/master 2 查看本地分支 1 2 3 $ git branch * br-2.1.2.2 master 3 创建分支 1 2 3 4 5 6 shuohailhl@SHUOHAILHL-PC /f/ggg/jingwei (br-2.1.2.2) $ git branch test $ git branch * br-2.1.2.2 master test 4 切换分支到test 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...

Git命令详解

这篇主要是给自己做个记录,因为 Git 指令实在太多了… Git 教学(1):Git的基本使用 Git 教学(2):Git Branch 的操作与基本工作流程 Git 情境剧:告诉你使用 Git 时什么情况该下什么指令 如何安装 Git Mac : 安装 Homebrew brew install git Linux(Debian) : apt-get install git-core Linux(Fedora) : yum install git-core Windows : 下载安装 msysGit 如何设定 Git Mac : Set Up Git on Mac Linux : Set Up Git on Linux Windows : Set up Git on Windows 如何开始一个 Git Respository 在专案底下使用 git init 开始一个新的 Git r ...

利用git自动部署环境

和@Leniy 说到利用git自动部署的事情,@Leniy 问了句,怎么配,既然有人有兴趣,我就扯几句。 git无疑是一个很赞的版本管理系统,简单易用不伤手。而如果在VPS上部署一个git,每次提交后,直接部署到环境中,不用ssh登进去顶着XXXms的延迟穷倒腾。 说明一下,我只是举个栗子,实现了”自动部署”的要求,看官可以做的远不止这些。 首先,环境要求: 要求客户端和服务端都有个git环境。 要求能push东西到服务端 要求能修改服务端的环境–ftp环境和ssh环境都可以接受其实,不过安全起见,最好让git的目录是web根目录的父目 ...

Git设定

设置用户名
$ git config –global user.name “username”



设置用户邮箱

$ git config –global user.email “user@Gmail.com”


加上 --global 表示是全局的设定。你可以使用 git config --list 这个指令來看你的 Git 设定內容
$ git config –list user.name=username user.email=user@Gmail.com



或是其实 Git 的设定档是储存在你的家目下的.gitconfig 隐藏档中,你可以使用编辑器将他们打开
$ cat ~/.gitconfig [user] name = username email =user@Gmail.com



使用终端来操作Git常会让人觉得一直打指令很繁琐,因此Git也有提供alias的功能,例如可以将git status缩写为git st,
$ git config –global alias.st status
这样一来只要打 git st 就等同于打 git status 了。



空白对有些语言是有影响的(像是Ruby),因为我们希望Git去忽略空白的变化,这时候你需要在你的设置加入:
$ git config –global apply.whitespace nowarn
如此一來 Git 对于空白的变化便会忽略不計。



Git预设输出是没有颜色的,我们可以让他在输出时加上颜色让我们更容易阅读:
$ git config –global color.ui true


开始使用Git (init, clone)

要开始使用 Git 你必须先建立一个 Git 的 Repository,你可以把它想做是一个资料库的意思,有两种方法可以建立一个 Git 的 Repository:

自己建立一个新的 Repository

例如我现在有个叫做 Animal 专案资料夹,我现在想要开始使用 Git 开始管理,因此我先将目录切换到 Animal 底下后输入git init

$ git init
Initialized empty Git repository in /Users/Jimmy/Projects/Animal/.git/

这时你就会看到 Git 告诉你说已经在这边建立好一个新的 Git Repository。


Clone(复制)别人的 Repository

例如我们在Github 上面看到人家的程式码想要抓下来自己修改,或是团队中别人的程式码,这时候他们通常会有一个Git 的档案位置像是在Github 的话你就会看到像下面的地方可以让你复制git 的clone 位置:

git clone

将他复制起来后到你的目录下输入 git clone

$ git clone https://gogojimmy@github.com/gogojimmy/Animal.git
如此便会将这个Git Repository下载到我们的资料夹, git clone 预设会将下载的git 存成一样档名的资料夹,如果你要更改成别的名称的话只需要在网址后面加上你想要更改的名称即可,像是:

$ git clone https://gogojimmy@github.com/gogojimmy/Animal.git    monkey
这样子下载下来的 Repository 的名称就会从原本的 Animal 变成 monkey 了。


Git的基本功(status, add, commit, log, .gitignore)

在一个 Git 的 Repository 中你可以输入git status来检查目前 Git 的状态

$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use “git add” to track)
这代表目前是一个干净的目录状态,没有未被追踪或是被修改的档案, On branch master 表示你目前正在名为 master 的 branch 上,等等会再说明 branch 的功用。我们现在在这个目录新增一个 test 档案后,再使用git status 来查看:

$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use “git add …” to include in what will be committed)
#
# test.rb
nothing added to commit but untracked files present (use “git add” to track)
这时候你会看到我刚刚新增的test.rb 档案变成在Untracked files (未被追踪的档案),表示过去在这个Git Repository 中从未有这支档案,是一支未被追踪的档案,我们要把这个档案让Git 能够追踪的话,我们使用git add 这个指令来把它加入追踪:

$ git add test.rb
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use “git rm –cached …” to unstage)
#
# new file: test.rb
#
你可以看到原本test.rb 还在Untracked files 中,经过我们使用git add test.rb 后他就变成了Changes to commit,通常我们称这个状态叫做stage ,修改过但还没使用git add 的档案称为unstage 。


Tips: 一次加入全部的档案

如果你一次修改了很多档案,懒得一个一个输入git add 的话,你可以输入git add . 这会帮你将所有刚刚修改过或新增加的档案一次Add 进stage 状态,但强烈不推荐这样的作法,这样的方法虽然方便但很容易会不小心加入一些其他不必要的档案,一个正确的观念是你必须随时都很清楚你的档案状态,因此最好是手动将你确定要加入的档案使用git add 来加入,有一个更好的作法是使用互动模式git add -i ,在互动模式下你可以方便的选择你要加入的档案,或是移除刚刚不小心加入的档案(revert)。

已经在stage 状态的档案的下一步就是准备提交( commit ),commit 是写程式时一个很重要的动作,一个commit 在Git 中就是一个节点,这些commit 的节点就是未来你可以回朔及追踪的参考,你可以想像就像是电玩游戏时的存档,每一个commit 就是一次存档,让我们未来在需要的时候都可以回到这些存档时的状态。因此我们将刚刚做的修改提交:

$ git commit
此时你会看到画面跳到你在 git 中设定的编辑器画面:

#
# Please enter the commit message for your changes. Lines starting
# with ‘#’ will be ignored, and an empty message aborts the commit.
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use “git rm –cached …” to unstage)
#
# new file: test.rb
#
这个视窗中最上面的空行是要给你写下你这次commit 的讯息,例如在这里写下“Add test.rb file to test git function”来表示这一次提交的目的,强烈建议在commit 的时候要尽量清楚表达这次commit 的内容为何,因为这会让你未来要回头看code 的时候能让你快速的找到你想要找的内容,也能对团队中其他成员了解你在做什么。

在 commit 完后会显出出你这次 commit 的更动:

[master 5f76371] add ignore files
2 files changed, 8 insertions(+), 0 deletions(-)
create mode 100644 .gitignore
create mode 100644 test.rb
如果你觉得每次这样跳出编辑器很麻烦,你也可以在 commit 时加上 -m 的参数来快速提交:

$ git commit -m “Add test.rb to test git function”
若使用-am 的话还能将所有未被add 的档案一并add 进来( 更新:如果是第一次新增还没有被add 的档案是不会一起加入的,只有之前已经被add 过commit 的档案才会被加入),但就像前面所说这样的作法并不推荐,你应该清楚的加入你应该加入的档案就好:

$ git commit -am “Add test.rb to test git function”
若使用 -v 的话会列出更动的纪录:
# Please enter the commit message for your changes. Lines starting
# with ‘#’ will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# (use “git reset HEAD …” to unstage)
#
# new file: .gitignore
# new file: test.rb
#
diff –git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..61521a9
— /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+.DS_Store
+*.swp
+log/*.log
diff –git a/test.rb b/test.rb
new file mode 100644
index 0000000..23df1c1
— /dev/null
+++ b/test.rb
@@ -0,0 +1,5 @@
+class Test
+ def test
+ puts “This is a test file”
+ end
+end
加号(+)代表增加的部份,减号(–)代表删除的部份。

我们可以使用 git log 的指令查看过去 commit 的纪录:

$ git log
5f76371 – (HEAD, master) add ignore files (3 minutes ago)
4ca268d – (origin/master) First commit (33 minutes ago)
前面的乱码代表的是当次 commit 的版号,后面的是 commit 的讯息、时间以及 commit的作者,你可以使用 –stat 参数看到更详尽的讯息:

$ git log –stat
5f76371 – (HEAD, master) add ignore files (7 minutes ago)
.gitignore | 3 +++
test.rb | 5 +++++
2 files changed, 8 insertions(+), 0 deletions(-)

4ca268d – (origin/master) First commit (37 minutes ago)
lib/animal.rb | 5 +++++
spec/animal_spec.rb | 5 +++++
2 files changed, 10 insertions(+), 0 deletions(-)
如果你想看到档案更详细的变更内容,你可以加上 -p 的参数:

$ git log -p
5f76371 – (HEAD, master) add ignore files (8 minutes ago)
diff –git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..61521a9
— /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+.DS_Store
+*.swp
+log/*.log
diff –git a/test.rb b/test.rb
new file mode 100644
index 0000000..23df1c1
— /dev/null
+++ b/test.rb
@@ -0,0 +1,5 @@
+class Test
+ def test
+ puts “This is a test file”
+ end
+end
因此我们稍微做一下流程的整理:

修改档案 => 加入 stage (git add) => 提交( git commit )=> 继续修改其他档案

Tips: commit 的最佳时机?什么时候该 commit ?

什么时候才是commit 的最好时机并没有一个定论,大部分人会告诉你通常你完成了一个阶段性的小工作就做一次的commit ,我的感觉是当你想要记录目前的状态的时候就是你commit 的最佳时机,例如说刚完成某个page,某个任务需求而你想要做个记录的时候。

有些档案我们不希望加入版本控制的追踪,例如说Database的schema或是一些log档,这时候你可以将他们加入 .gitignore 中来让 Git 忽略他们,使用编辑器来打开你的 .gitignore 档案。

$ vim .gitignore
在这边假设我想将 Mac 自动产生的.DS_Store, vim 的 swp 暂存档及 log 档忽略,我便分行加入:

.DS_Store
*.swp
log/*.log
如此一来便会将这些档案从git追踪忽略了。

Tips: 被加入 gitignore 的档案一样出现在 status 中?

有时候你会发现即时你将档案加入了.gitignore 却一样会出现在Git 的追踪状态中,这是由于你想要忽略的档案之前已经被Git 追踪了,因此你现在想要让Git 忽略他的话只能先将他删除然后再commit 一次,再来这支档案再出现就不会再追踪这支档案了。