`

progit学习笔记-基础

    博客分类:
  • git
git 
阅读更多

SVN这类集中式工具记录提交后的修改内容,而GIT在每次修改提交后,记录一个快照。

三种状态:

已提交-commited;已修改-modified;已暂存-staged。

git目录是当前项目的数据仓库,克隆是就是从它里面解压出项目文件。

 

源码安装

$tar -zxf xxx.tar.gz

$cd xxx

$make prefix=/usr/local all

$sudo make prefix=/usr/local install

 

git config

Linux下三种级别的配置方式:

/etc/gitconfig 使用git config --system选项时写这个文件; ~/.gitconfig当前用户 使用git config --global;

再就是每个git目录中的.git/config文件。优先级对应也最高。

基础配置:

$git config --global user.name "loujunhui"

$ git config --global user.email xxxx

$ git config --global core.editor emacs   //如果希望GIT打开的文本编辑器是emacs

$ git config --global merge.tool vimdiff //差异比较使用vimdiff。Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等

查看配置信息

$ git config --list

$ git config user.name

获取帮助

$ git help <verb>

$ git <verb> help

$ man git-<verb>

例如:git help config

第二章

2.1 建库

方式:clone另外一个库;或者通过命令将当前目录转换为库。

从目录初始化

$ git init

初始当前目录为git需要管理的目录,但是只是初始化,具体哪些文件需要入到库里,而哪些又不需要,是通过 git add命令来添加。git init命令会在当前目录下创建.git目录。

$ git add *.java

$ git add readme.txt

$ git commit -m "initial project"

这样就等到了一个维护目标文件的git库。--想想,库的名称呢,地址呢,怎么共享?

 

clone

clone命令会把目标库的所有版本记录日志等复制下来。

$ git clone <url>

执行后,会在本地建立一个以 url中xxx.git的xxx命名的目录。并把这个项目的最新版本内容从仓库中复制出来,也就是clone默认是当前最新版本。

$ git clone git://github.com/schacon/grit.git mygrit 指定目录名称

 

2.2 记录更新内容到仓库

库中的文件分两种:已跟踪 与 未跟踪。已跟踪的又分已修改,也暂存,已提交。而未跟踪的就是除了这些的。通过 clone产生的库,是已跟踪的未修改状态。

文件的状态变化示意图:

检查目录下的文件状态

$ git status

$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: README
#

 在Changes to be committed下在的都是处于暂存状态

$ git add 命令会添加符合条件的子目录(递归)

 

暂存已修改文件

修改文件后,执行git status,会显示Changes not staged for commit。并显示哪些文件修改了还没有暂存。

通过$ git add命令将修改的文件添加到暂存区。(git add 命令是多功能命令,它根据目标文件的状态:可以将未跟踪的文件添加为跟踪,也可以将跟踪已修改添加到暂存区,在冲突合并时,将冲突的文件标记为已解决)。

忽略文件

创建文件 .gitignore。比如

*.[oa]    *.o或*.a

*~      ~结尾者

忽略文件规则:

  • #为注解
  • 使用标准的glob模式匹配(所谓的 glob 模式是指 shell 所使用的简化了的正则表达式)
  • 匹配模式最后使用/说明忽略的是目录
  • 要忽略指定模式以外的任何文件,使用!取反
# 此为注释 – 将被 Git 忽略
*.a # 忽略所有 .a 结尾的文件
!lib.a # 但 lib.a 除外
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

 

查看更新(已暂存或未暂存)

$ git diff    未暂存

$ git diff --cached 或者git diff --staged    已暂存

 

提交更新

提交前最好先git status一下。git commit命令会打开一个编辑输入端用于输入描述。显示的注释不会提交到库中,如果希望将差异做为注释的一部分,使用-v参数。

使用-m参数直接跟注释。

 

跳过使用暂存区

$ git commit -a 把所有已跟踪的文件提交。

 

移除文件

$ git rm

如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项-f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。

$ git rm --cached readme.txt

移除跟踪但是不删除文件,后面再把这文件添加到忽略中。

$ git rm log/\*.log 也可以使用glob模式。\表示递归删除。

 

移动文件

$ git mv file_from file_to

这条命令其它执行下面三个步

$ mv README.txt README

$ git rm README.txt

$ git add README

 

2.3 查看历史版本

$ git log

$ git log -p -2   -p表示显示差异同,-2表示显示最近两次 --stat显示简要的增改行数。

--pretty用于展示格式设定。如--pretty=oneline将每次提交显示在一行。其它选项有:short ,full, fuller。

format可以定制显示的格式。

$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 11 months ago : changed the verison number
085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
a11bef0 - Scott Chacon, 11 months ago : first commit

常用的格式占位符写法及其代表的意义

选项 说明

%H 提交对象(commit)的完整哈希字串

%h 提交对象的简短哈希字串

%T 树对象(tree)的完整哈希字串

%t 树对象的简短哈希字串

%P 父对象(parent)的完整哈希字串

%p 父对象的简短哈希字串

%an 作者(author)的名字

%ae 作者的电子邮件地址

%ad 作者修订日期(可以用 -date= 选项定制格式)

%ar 作者修订日期,按多久以前的方式显示

%cn 提交者(committer)的名字

%ce 提交者的电子邮件地址

%cd 提交日期

%cr 提交日期,按多久以前的方式显示

%s 提交说明

 

在使用oneline与format时,结合--graph参数,将会显示每次提交所在的分支及其分化衍合情况。

$ git log --since=2.weeks。时间格式可以为2008-10-03,或者2 years 1 day 3 minutes ago

--author指定作者的提交;--grep根据提交说明搜索;如果多个选项同时指定希望都生效,使用--all-match

 

2.4 撤消操作

2.4.1修改最后一次提交

$ git commit --amend

 使用暂存区里的内容再次提交重写最后一次的提交。

 

2.4.2 取消已暂存的文件

$ git status命令提示了如何取消那些修改了已暂存的文件。即使用 git reset HEAD  <filename>...。

2.4.3 取消对文件的修改

$ git status命令有指引。即通过git checkout -- <filename>...。

注意这样会把修改取消,如果只是希望保留修改。可使用stashing分支来管理,这个后面讲。

 

2.5 远程仓库

2.5.1 查看当前(项目的)远程库

$ git remote 。使用clone命令创建的库,默认显示origin。自己通过git init创建的则默认为空。

 使用git remote -v 查看对应的远程URL,v是verbose-冗长的缩写。

 

2.5.1 添加远程库

$ git remote add [shortname] [url]。然后就可以通过git fetch shortname来获取远程库内容。

 

2.5.3 从远程库获取内容

$ git fetch shortname。这个命令会获取所有本地仓库还没有的内容。然后就可以在本地访问对应远程库的所有分支,也可以将指定分支合并到本地。

git fetch origin,会把clone以后所有修改下到本地,但是不会主动合并到工作分支。

git pull将远程分支合并到当前分支。clone命令默认从远程库创建一个master分支用于跟踪远程的master分支。工作中,我们基于master拉分支出来,在需要更新时,切换到master分支,然后执行git pull。然后手工合并master分支与我们的工作分支。

 

2.5.4 推送数据到远程库

$ git push [remote-name] [branch-name]。clone产生的库,如果不拉任何分支。默认命令应该是

$ git push origin master。origin与master都是clone默认产生的远程库shortname及本地的分支名称。

如果远程库有更新,则推送会失败。

 

2.5.5 查看远程库信息

 $ git remote show [remote-name]

 

$ git remote show origin
* remote origin
URL: git@github.com:defunkt/github.git
Remote branch merged with 'git pull' while on branch issues#在issues上pull会从远程issues
  issues
Remote branch merged with 'git pull' while on branch master #如果在master git pull会合并
  master
New remote branches (next fetch will store in remotes/origin) #远程新的分支在本地还没有
  caching
Stale tracking branches (use 'git remote prune') #已同步的分支在远程已经删除
  libwalker
  walker2
Tracked remote branches  #跟踪的远程分支
  acl
  apiv2
  dashboard2
  issues
  master
  postgres
Local branch pushed with 'git push' #使用git push命令默认推送的分支
  master:master
 

 

 2.5.6 删除和重命名远程仓库

$ git remote rename origin newname

注意:对远程库名称的修改,对应分支的名称也跟着改。如origin/master将改为newname/master

$ git remote rm remote-name 删除远程库。

 

2.6 打标签

2.6.1列出已有标签

$ git tag

$ git tag -l 'v1.4.2.*'

 

2.6.2 新建标签

标签分两种:轻量级lightweight与含附注的annotated。前者是指向特定提交的引用。后者是存储在仓库中的一个独立的对象,自身有校验和信息。包含标签的名字,电子邮件和日期,以及标签说明。

含附注标签

$ git tag -a v1.4 -m "my version 1.4"

查看标签

$ git show v1.4

签署标签

$ git tag -s v1.5 -m "my signed 1.5 tag"

轻量级标签

$ git tag v1.4-1w

验证标签

$ git tag -v [tag-name] (v-verify)
后期加注标签

对前面提交的加注一个标签。

$ git tag -a v1.2 9fceb0   后面跟上对应提交的校验和,或者校验和的前几位。

分享标签

默认推送不包含标签

$ git push origin v1.5

$ git push origin --tags   #把所有标签都推送上去。

 

2.7 技巧

2.7.1 自动命令补全

Linux下:下载Git的源代码,进入contrib/completion目录,把git-completion.bash复制到用户主目录。改名前面加个点。然后在.bashrc中添加

source ~/.git-completion.base

设为全局:

Mac上将这个脚本文件复制到/opt/local/etc/bash_completion.d目录下。Linux复制到/etc/bash_completion.d/目录下。在Bash启动时自动加载它。

Windows 下使用msysGit安装,默认使用的Git Bash已经配置好了。

 

2.7.2 Git命令别名

$ git config --global alias.co checkout

$ git config --global alias.br branch

$ git config --global alias.ci commit

$ git config --global alias.st status

这样git co就等同于git checkout

$ git config --global alias.unstage 'reset HEAD --'

这里定义了一条命令unstage,然后

$ git unstage fileA等同于$ git reset HEAD fileA

 

$ git config --global alias.last 'log -1 HEAD' 显示最后一次提交的日志信息

运行外部命令:

$ git config --global alias.visual '!gitk'

 

 

 

 

 

  • 大小: 67.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics