1 Git 操作指南 http://zerodoo.appspot.com/scm.git.1.0001.html
1.1 序
Git是分布式版本控制系统,与集中化的版本控制系统相比有以下好处:
每个客户端都是服务器代码仓库的完整镜像,在服务器发生故障时都可以从任 一个客户端的代码仓库进行恢复。
可以离线提交。客户端本身就是一个代码仓库,所有操作都是在本地代码仓库进行,在本地仓 库也存有项目的历史更新摘要,等到了有网络的时候再上传到远程的镜像仓库。
灵活的patch处理
可以push到多个远端仓库
提交、审核、接受、发布的流程控制可随需而定
本地分支成本小,灵活
本指南使用的git版本为 git version 1.6.3.3 。
1.2 本地仓库操作
1.2.1 新建空库
要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录,或者新建一 个空目录并进入此目录,执行:
git init
初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据 和资源都存放在这个目录中。
mkdir aa
cd aa
git init --bare
aa目录下的内容就是 git init 命令执行后当前目录下的 .git目录下的内容。 aa目录不能作为项目的工作目录,只是一个空的git仓库。该命令可以用于创建 一个空的项目共享仓库(或者说是远程仓库)。
1.2.2 从远程仓库克隆
如果想对某个开源项目出一份力,可以先把该项目的 Git 仓库复制一份出来, 这就需要用到 git clone 命令。如果你熟悉其他的 VCS 比如 Subversion,你 可能已经注意到这里使用的是 clone 而不是 checkout 。这是个非常重要的差 别,Git 收取的是项目历史的所有数据(每一个文件的每一个版本),服务器上 有的数据克隆之后本地也都有了。实际上,即便服务器的磁盘发生故障,用任何 一个克隆出来的客户端都可以重建服务器上的仓库,回到当初克隆时的状态(可 能会丢失某些服务器端的挂钩设置,但所有版本的数据仍旧还在。
克隆仓库的命令格式为 git clone [url] 。比如,要克隆 Ruby 语言的 Git 代码仓库 Grit,可以用下面的命令:
$ git clone git://github.com/schacon/grit.git
这会在当前目录下创建一个名为 “grit” 的目录,其中内含一个 .git 的目录, 并从同步后的仓库中拉出所有的数据,取出最新版本的文件拷贝。如果进入这个 新建的 grit 目录,你会看到项目中的所有文件已经在里边了,准备好后续的开 发和使用。
同时此命令会自动建立一个名称为 origin 的远程仓库。(可以用 git remote -v 查看到。
如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上 面的命令最后指定:
git clone git://github.com/schacon/grit.git mygrit
唯一的差别就是,现在新建的目录成了 mygrit,其他的都和上边的一样。
Git 支持许多数据传输协议。之前的例子使用的是 git:// 协议,不过你也可以 用 http(s):// 或者 user@server:/path.git 表示的 SSH 传输协议。我们会在 后面详细介绍所有这些协议在服务器端该如何配置使用,以及各种方式之间的 利弊。
1.2.3 从远程仓库新建一个纯仓库
git clone --bare git://github.com/schacon/grit.git
git clone --bare . ../grit.git # 如果当前在一个项目的工作目录
git clone --bare ~/space/notes ~/gitroot/space.git
与不带 --bare 参数的命令相比,有两个不同:
会创建一个纯的仓库,而不是工作目录。即仅包含了 Git 目录,没有工作目 录。实际上就是相当于将 notes/.git 目录下的内容拷贝到 space.git 目录 下。即:
cp -Rf ~/space/notes/.git ~/gitroot/space.git
不会创建远程仓库,如果用 git remote -v 查看时,会什么也看不到。
应用场景:我们可以用这个命令建立一个纯仓库作为中央代码仓库。
1.3 远程仓库操作
使用 git clone 会默认创建一个指向clone远程仓库地址的名称为 origin 的远程仓库(不带 --bare),Git 默认使用 origin 这个名字来标识你所克隆的原始仓库。
1.3.1 查看远程仓库
git remote # 仅显示远程仓库名称
git remote -v # 显示远程仓库名称和仓库地址
git remote show # 同git remote
git remote show origin # 查看远程仓库名称为 origin
1.4 比较不同(git diff)
git diff # 此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。
git diff --cached # 看已经暂存起来的文件和上次提交时的快照之间的差异
git diff -- src/work.org #看某个文件的差异
1.5 抓取(git pull, git fetch)
正如之前所看到的,可以用下面的命令从远程仓库抓取数据到本地:
git fetch [remote-name]
此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。运行完成后,你就 可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地,或者只 是取出某个分支,一探究竟。
如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。所以,git fetch origin 会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或 是上次 fetch 以来别人提交的更新)。有一点很重要,需要记住,fetch 命令只 是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准 备好了,才能手工合并。
如果设置了某个分支用于跟踪某个远端仓库的分支(参见下节及第三章的内 容),可以使用 git pull 命令自动抓取数据下来,然后将远端分支自动合并到 本地仓库中当前分支。在日常工作中我们经常这么用,既快且好。实际上,默认 情况下 git clone 命令本质上就是自动创建了本地的 master 分支用于跟踪远程 仓库中的 master 分支(假设远程仓库确实有 master 分支)。所以一般我们运 行 git pull ,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录 中当前分支。
1.6 推送(git push)
1.6.1 默认推送(跟踪分支推送)
跟踪分支是 一种和远程分支有直接联系的本地分支。在跟踪分支里输入 git push,Git 会自行推断应该向哪个服务器的哪个分支推送数据。
在克隆仓库时,Git 通常会自动创建一个 master 分支来跟踪 origin/master。 这正是 git push 和 git pull 一开始就能正常工作的原因。当然,你可以随心 所欲地设定为其它跟踪分支,比如 origin 上除了 master 之外的其它分支。
git push # 将跟踪分支推送到origin的对应分支
运行时可能会出现如下信息:
warning: You did not specify any refspecs to push, and the current remote
warning: has not configured any push refspecs. The default action in this
warning: case is to push all matching refspecs, that is, all branches
warning: that exist both locally and remotely will be updated. This may
warning: not necessarily be what you want to happen.
warning:
warning: You can specify what action you want to take in this case, and
warning: avoid seeing this message again, by configuring 'push.default' to:
warning: 'nothing' : Do not push anything
warning: 'matching' : Push all matching branches (default)
warning: 'tracking' : Push the current branch to whatever it is tracking
warning: 'current' : Push the current branch
我们可以通过设定改变 git push 的默认行为。通过运行 git remote show origin 可以看到会推送哪些分支到远程仓库。
1.6.2 分支推送
要想和其他人分享某个分支,你需要把它推送到一个你拥有写权限的远程仓库。 你的本地分支不会被自动同步到你引入的远程分支中,除非你明确执行推送操作。 换句话说,对于无意分享的,你尽可以保留为私人分支,而只推送那些协同工作 的特性分支。(请参考上面一节 *默认推送(跟踪分支推送) 的说明。
如果你有个叫 serverfix 的分支需要和他人一起开发,可以运行 git push (远 程仓库名) (分支名):
git push origin master # 提取我的master分支 并更新到远程仓库的master分支
git push origin serverfix # 提取我的serverfix分支 并更新到远程仓库的serverfix分支
git push origin serverfix:remoteserverfix # 提取我的 serverfix分支 并更新到远程仓库的remoteserverfix分支
git push origin :serverfix # 删除远程分支 serverfix(在这里提取空白然后把它变成[远程分支])
1.6.3 标签推送
默认情况下,git push并不会把标签推送到远程仓库,只有通过显式命令才能分 享标签到远程仓库。其命令格式如同推送分支,运行 =git push origin [tagname]即可。
git push origin v1.5
如果要一次推送所有(本地新增的)b标签上去,可以使用 --tags 选项:
git push origin --tags
现在,其他人克隆共享仓库或拉取数据同步后,也会看到这些标签。
1.7 场景操作
2 转载记录
本文摘自:http://plog.longwin.com.tw/my_note-unix/2009/05/20/git-learn-test-command-2009
2.1 概念
2.1.1 取得项目的 Git 仓库
有两种取得 Git 项目仓库的方法。第一种是在现存的目录下,通过导入所有文 件来创建新的 Git 仓库。第二种是从已有的 Git 仓库克隆出一个新的镜像仓库 来。
从当前目录初始化
要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录,执行:
$ git init
初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据 和资源都存放在这个目录中。不过目前,仅仅是按照既有的结构框架初始化好了 里边所有的文件和目录,但我们还没有开始跟踪管理项目中的任何一个文件。 (在第九章我们会详细说明刚才创建的 .git 目录中究竟有哪些文件,以及都起 些什么作用。)
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:
$ git add *.c
$ git add README
$ git commit -m 'initial project version'
稍后我们再逐一解释每条命令的意思。不过现在,你已经得到了一个实际维护着 若干文件的 Git 仓库。
从现有仓库克隆
如果想对某个开源项目出一份力,可以先把该项目的 Git 仓库复制一份出来, 这就需要用到 git clone 命令。如果你熟悉其他的 VCS 比如 Subversion,你 可能已经注意到这里使用的是 clone 而不是 checkout 。这是个非常重要的差 别,Git 收取的是项目历史的所有数据(每一个文件的每一个版本),服务器上 有的数据克隆之后本地也都有了。实际上,即便服务器的磁盘发生故障,用任何 一个克隆出来的客户端都可以重建服务器上的仓库,回到当初克隆时的状态(可 能会丢失某些服务器端的挂钩设置,但所有版本的数据仍旧还在,有关细节请参 考第四章)。
克隆仓库的命令格式为 git clone [url] 。比如,要克隆 Ruby 语言的 Git 代码仓库 Grit,可以用下面的命令:
$ git clone git://github.com/schacon/grit.git
这会在当前目录下创建一个名为 “grit” 的目录,其中内含一个 .git 的目录, 并从同步后的仓库中拉出所有的数据,取出最新版本的文件拷贝。如果进入这个 新建的 grit 目录,你会看到项目中的所有文件已经在里边了,准备好后续的开 发和使用。如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上 面的命令最后指定:
$ git clone git://github.com/schacon/grit.git mygrit
唯一的差别就是,现在新建的目录成了 mygrit,其他的都和上边的一样。
Git 支持许多数据传输协议。之前的例子使用的是 git:// 协议,不过你也可以 用 http(s):// 或者 user@server:/path.git 表示的 SSH 传输协议。我们会在 后面详细介绍所有这些协议在服务器端该如何配置使用,以及各种方式之间的 利弊。
2.2 常用指令
2.2.1 获得git仓库
使用 git-clone 命令下载一个仓库的拷贝。
# git itself (approx. 10MB download):
$ git clone git://git.kernel.org/pub/scm/git/git.git
# the Linux kernel (approx. 150MB download):
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
2.2.2 git add
这是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:可以用它 开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的 文件标记为已解决状态等
$ git add . # 將資料先暫存到 staging area, add 之後再新增的資料, 於此次 commit 不會含在裡面.
$ git add filename
$ git add modify-file # 修改過的檔案, 也要 add. (不然 commit 要加上 -a 的參數)
$ git add -u # 只加修改過的檔案, 新增的檔案不加入.
$ git add -i # 進入互動模式
描述
参数
配置
例子
2.2.3 git push (远程仓库名) (分支名)
2.3 实作练习
2.3.1 Git 建立 Local Repository
1: $ mkdir project;
2: $ cd project
3: $ git init
4: $ echo "hello" > hello.txt
5: $ git add .
6: $ git commit -m 'initial'
2.3.2 Git clone 資料, 資料修改後上傳
1: $ git clone http://git.example.com/project.git
2: $ cd project
3: $ touch new_file.txt
4: $ git add .
5: $ git commit -m 'add new_file.txt'
6: $ git push origin master
7: $ git pull # 拉看看有沒有更新
2.4 扩展应用
2.4.1 在 Google Code 中使用 Git
参见:http://linuxtoy.org/archives/google-code-git.html
2.5 安装
2.5.1 在 Linux 上安装
如果要在 Linux 上安装预编译好的 Git 二进制安装包,可以直接用系统提供的 包管理工具。
在 Fedora 上用 yum 安装:
$ yum install git-core
在 Ubuntu 这类 Debian 体系的系统上,可以用 apt-get 安装:
$ apt-get instal git-core
2.5.2 在 Windows 上安装
在 Windows 上安装 Git 同样轻松,有个叫做 msysGit 的项目提供了安装包, 可以从 Google Code 的页面上下载安装文件(.exe):
http://code.google.com/p/msysgit
完成安装之后,就可以使用命令行的 git 工具(已经自带了 ssh 客户端)了, 另外还有一个图形界面的 Git 项目管理工具。
2.5.3 在 Mac 上安装
在 Mac 上安装 Git 有两种方式。最容易的当属使用图形化的 Git 安装工具, 界面如图 1-7,下载地址在:
http://code.google.com/p/git-osx-installer
另一种是通过 MacPorts (http://www.macports.org) 安装。如果已经装好了 MacPorts,用下面的命令安装 Git:
$ sudo port install git-core +svn +doc +bash_completion +gitweb
这种方式就不需要再自己安装依赖库了,Macports 会帮你搞定这些麻烦事。一 般上面列出的安装选项已经够用,要是你想用 Git 连接 Subversion 的代码仓 库,还可以加上 +svn 选项,具体将在第八章作介绍。
2.6 配置
Git 提供了一个叫做 git config 的工具(译注:实际是 git-config 命令,只 不过可以通过 git 加一个名字来呼叫此命令。),专门用来配置或读取相应的 工作环境变量。而正是由这些环境变量,决定了 Git 在各个环节的具体工作方 式和行为。这些变量可以存放在以下三个不同的地方:
/etc/gitconfig 文件 :系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
~/.gitconfig 文件 :用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
当前项目的 git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。
每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆 盖 /etc/gitconfig 中的同名变量。
2.6.1 用户信息
第一个要配置的是你个人的用户名称和电子邮件地址。这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起 被永久纳入历史记录:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那 个,以后你所有的项目都会默认使用这里配置的用户信息。如果要在某个特定的 项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设 定保存在当前项目的 .git/config 文件里。
2.6.2 文本编辑器
接下来要设置的是默认使用的文本编辑器。Git 需要你输入一些额外消息的时 候,会自动调用一个外部文本编辑器给你用。默认会使用操作系统指定的默认编 辑器,一般可能会是 Vi 或者 Vim。如果你有其他偏好,比如 Emacs 的话,可 以重新设置:
$ git config --global core.editor emacs
2.6.3 差异分析工具
还有一个比较常用的是,在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话:
$ git config --global merge.tool vimdiff
Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的输出信息。当然,你也可以指定使用自己开发的工具, 具体怎么做可以参阅第七章。
2.6.4 查看配置信息
要检查已有的配置信息,可以使用 git config --list 命令:
$ git config --list
user.name=Scott Chacon
user.email=schacon@gmail.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...
有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 etc/gitconfig 和 ~.gitconfig),不过最终 Git 实际采用的是最后一个。
也可以直接查阅某个环境变量的设定,只要把特定的名字跟在后面即可,像这样:
$ git config user.name
Scott Chacon
2.7 获取帮助
想了解 Git 的各式工具该怎么用,可以阅读它们的使用帮助,方法有三:
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
比如,要学习 config 命令可以怎么用,运行:
$ git help config
我们随时都可以浏览这些帮助信息而无需连网。不过,要是你觉得还不够,可以 到 Frenode IRC 服务器(irc.freenode.net)上的 #git 或 #github 频道寻求 他人帮助。这两个频道上总有着上百号人,大多都有着丰富的 git 知识,并且 乐于助人。
2.8 常用指令
本篇参考 http://plog.longwin.com.tw/my_note-unix/2009/05/19/git-learn-initial-command-2009
2.8.1 Git 新增檔案
$ git add . # 將資料先暫存到 staging area, add 之後再新增的資料, 於此次 commit 不會含在裡面.
$ git add filename
$ git add modify-file # 修改過的檔案, 也要 add. (不然 commit 要加上 -a 的參數)
$ git add -u # 只加修改過的檔案, 新增的檔案不加入.
$ git add -i # 進入互動模式
2.8.2 Git 刪除檔案
$ git rm filename
2.8.3 Git 修改檔名、搬移目錄
$ git mv filename new-filename
2.8.4 Git status 看目前的狀態
$ git status # 看目前檔案的狀態
2.8.5 Git Commit
$ git commit
$ git commit -m 'commit message'
$ git commit -a -m 'commit -message' # 將所有修改過得檔案都 commit, 但是 新增的檔案 還是得要先 add.
$ git commit -a -v # -v 可以看到檔案哪些內容有被更改, -a 把所有修改的檔案都 commit
2.8.6 Git 產生新的 branch
$ git branch # 列出目前有多少 branch
$ git branch new-branch # 產生新的 branch (名稱: new-branch), 若沒有特別指定, 會由目前所在的 branch / master 直接複製一份.
$ git branch new-branch master # 由 master 產生新的 branch(new-branch)
$ git branch new-branch v1 # 由 tag(v1) 產生新的 branch(new-branch)
$ git branch -d new-branch # 刪除 new-branch
$ git branch -D new-branch # 強制刪除 new-branch
$ git checkout -b new-branch test # 產生新的 branch, 並同時切換過去 new-branch
$ # 與 remote repository 有關
$ git branch -r # 列出所有 Repository branch
$ git branch -a # 列出所有 branch
2.8.7 Git checkout 切換 branch
$ git checkout branch-name # 切換到 branch-name
$ git checkout master # 切換到 master
$ git checkout -b new-branch master # 從 master 建立新的 new-branch, 並同時切換過去 new-branch
$ git checkout -b newbranch # 由現在的環境為基礎, 建立新的 branch
$ git checkout -b newbranch origin # 於 origin 的基礎, 建立新的 branch
$ git checkout filename # 還原檔案到 Repository 狀態
$ git checkout HEAD . # 將所有檔案都 checkout 出來(最後一次 commit 的版本), 注意, 若有修改的檔案都會被還原到上一版. (git checkout -f 亦可)
$ git checkout xxxx . # 將所有檔案都 checkout 出來(xxxx commit 的版本, xxxx 是 commit 的編號前四碼), 注意, 若有修改的檔案都會被還原到上一版.
$ git checkout -- $ # 恢復到上一次 Commit 的狀態($ 改成檔名, 就可以只恢復那個檔案)
2.8.8 Git diff
$ git diff master # 與 Master 有哪些資料不同
$ git diff --cached # 比較 staging area 跟本來的 Repository
$ git diff tag1 tag2 # tag1, 與 tag2 的 diff
$ git diff tag1:file1 tag2:file2 # tag1, 與 tag2 的 file1, file2 的 diff
$ git diff # 比較 目前位置 與 staging area
$ git diff --cached # 比較 staging area 與 Repository 差異
$ git diff HEAD # 比較目前位置 與 Repository 差別
$ git diff new-branch # 比較目前位置 與 branch(new-branch) 的差別
$ git diff --stat
2.8.9 Git Tag
$ git tag v1 ebff # log 是 commit ebff810c461ad1924fc422fd1d01db23d858773b 的內容, 設定簡短好記得 Tag: v1
$ git tag 中文 ebff # tag 也可以下中文, 任何文字都可以
$ git tag -d 中文 # 把 tag=中文 刪掉
2.8.10 Git log
$ git log # 將所有 log 秀出
$ git log --all # 秀出所有的 log (含 branch)
$ git log -p # 將所有 log 和修改過得檔案內容列出
$ git log --stat --summary # 查每個版本間的更動檔案和行數
$ git log filename # 這個檔案的所有 log
$ git log directory # 這個目錄的所有 log
$ git log -S'foo()' # log 裡面有 foo() 這字串的.
$ git log --no-merges # 不要秀出 merge 的 log
$ git log --since="2 weeks ago" # 最後這 2週的 log
$ git log --pretty=oneline # 秀 log 的方式
$ git log --pretty=short # 秀 log 的方式
$ git log --pretty=format:'%h was %an, %ar, message: %s'
$ git log --pretty=format:'%h : %s' --graph # 會有簡單的文字圖形化, 分支等.
$ git log --pretty=format:'%h : %s' --topo-order --graph # 依照主分支排序
$ git log --pretty=format:'%h : %s' --date-order --graph # 依照時間排序
2.8.11 Git show
$ git show ebff # 查 log 是 commit ebff810c461ad1924fc422fd1d01db23d858773b 的內容
$ git show v1 # 查 tag:v1 的修改內容
$ git show v1:test.txt # 查 tag:v1 的 test.txt 檔案修改內容
$ git show HEAD # 此版本修改的資料
$ git show HEAD^ # 前一版修改的資料
$ git show HEAD^^ # 前前一版修改的資料
$ git show HEAD~4 # 前前前前一版修改的資料
2.8.12 Git reset 還原
$ git reset --hard HEAD # 還原到最前面
$ git reset --hard HEAD~3
$ git reset --soft HEAD~3
$ git reset HEAD filename # 從 staging area 狀態回到 unstaging 或 untracked (檔案內容並不會改變)
2.8.13 Git grep
$ git grep "te" v1 # 查 v1 是否有 "te" 的字串
$ git grep "te" # 查現在版本是否有 "te" 的字串
2.8.14 Git stash 暫存
$ git stash # 丟進暫存區
$ git stash list # 列出所有暫存區的資料
$ git stash pop # 取出最新的一筆, 並移除.
$ git stash apply # 取出最新的一筆 stash 暫存資料. 但是 stash 資料不移除
$ git stash clear # 把 stash 都清掉
2.8.15 Git merge 合併
$ git merge
$ git merge master
$ git merge new-branch
$ 下述轉載自: ihower 的 Git 版本控制系統(2) 開 branch 分支和操作遠端 repo.x
$ Straight merge 預設的合併模式,會有全部的被合併的 branch commits 記錄加上一個 merge-commit,看線圖會有兩條 Parents 線,並保留所有 commit log。
$ Squashed commit 壓縮成只有一個 merge-commit,不會有被合併的 log。SVN 的 merge 即是如此。
$ cherry-pick 只合併指定的 commit
$ rebase 變更 branch 的分支點:找到要合併的兩個 branch 的共同的祖先,然後先只用要被 merge 的 branch 來 commit 一遍,然後再用目前 branch 再 commit 上去。這方式僅適合還沒分享給別人的 local branch,因為等於砍掉重練 commit log。
指令操作
$ git merge <branch_name> # 合併另一個 branch,若沒有 conflict 衝突會直接 commit。若需要解決衝突則會再多一個 commit。
$ git merge --squash <branch_name> # 將另一個 branch 的 commit 合併為一筆,特別適合需要做實驗的 fixes bug 或 new feature,最後只留結果。合併完不會幫你先 commit。
$ git cherry-pick 321d76f # 只合併特定其中一個 commit。如果要合併多個,可以加上 -n 指令就不會先幫你 commit,這樣可以多 pick幾個要合併的 commit,最後再 git commit 即可。
2.8.16 Git blame
$ git blame filename # 關於此檔案的所有 commit 紀錄
2.8.17 Git 還原已被刪除的檔案
$ git ls-files -d # 查看已刪除的檔案
$ git ls-files -d | xargs git checkout -- # 將已刪除的檔案還原
2.8.18 Git 維護
$ git gc # 整理前和整理後的差異, 可由: git count-objects 看到.
$ git fsck --full
2.8.19 Git revert 資料還原
$ git revert HEAD # 回到前一次 commit 的狀態
$ git revert HEAD^ # 回到前前一次 commit 的狀態
$ git reset HEAD filename # 從 staging area 狀態回到 unstaging 或 untracked (檔案內容並不會改變)
$ git checkout filename # 從 unstaging 狀態回到最初 Repository 的檔案(檔案內容變回修改前)
以下與 遠端 Repository 相關
2.8.20 Git remote 維護遠端檔案
$ git remote
$ git remote add new-branch http://git.example.com.tw/project.git # 增加遠端 Repository 的 branch(origin -> project)
$ git remote show # 秀出現在有多少 Repository
$ git remote rm new-branch # 刪掉
$ git remote update # 更新所有 Repository branch
$ git branch -r # 列出所有 Repository branch
2.8.21 抓取 / 切換 Repository 的 branch
$ git fetch origin
$ git checkout --track -b reps-branch origin/reps-branch # 抓取 reps-branch, 並將此 branch 建立於 local 的 reps-branch
2.8.22 刪除 Repository 的 branch
$ git push origin :heads/reps-branch
3 patch文件的结构
补丁头
补丁头是分别由—/+++开头的两行,用来表示要打补丁的文件。—开头表示旧文件,+++开头表示新文件。
一个补丁文件中的多个补丁
一个补丁文件中可能包含以—/+++开头的很多节,每一节用来打一个补丁。所以在一个补丁文件中可以包含好多个补丁。
块
块是补丁中要修改的地方。它通常由一部分不用修改的东西开始和结束。他们只是用来表示要修改的位置。他们通常以@@开始,结束于另一个块的开始或者一个新的补丁头。
块的缩进
块会缩进一列,而这一列是用来表示这一行是要增加还是要删除的。
块的第一列
+号表示这一行是要加上的。
-号表示这一行是要删除的。
没有加号也没有减号表示这里只是引用的而不需要修改。
posted on 2011-04-09 02:38
汪杰 阅读(4014)
评论(0) 编辑 收藏 引用