Git使用初步

1. 配置

1.1 设置用户信息(必不可省)
$ git config --global user.name "githubID"
$ git config --global user.email 'youremail'
1.2 gitconfig文件作用范围

/etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。 git config 时用 --system
~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。 git config 时用 --global
.git/config 文件:当前项目的 git 目录中的配置文件,这里的配置仅仅针对当前项目有效

每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。


2. 开始

① 初始化一个仓库

mkdir my-git
cd my-git
git init

② 或者克隆一个仓库

git clone git://github.com/monicedy/cw.git [rename]

克隆一个裸仓库

git clone --bare my-git

2.2 git status查看当前文件状态

文件状态变化周期图

文件状态变化周期


2.3 git add的三种不同功能
  1. 开始跟踪新文件
  2. 把已跟踪的文件放到暂存区
  3. 合并时把有冲突的文件标记为已解决状态

2.4.gitignore忽略某些文件

1.所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
2.可以使用标准的 glob 模式匹配。
3.匹配模式最后跟反斜杠(/)说明要忽略的是目录。
4.要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。



# 此为注释 – 将被 Git 忽略
    # 忽略所有 .a 结尾的文件
    *.a
    # 但 lib.a 除外
    !lib.a
    # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
    /TODO
    # 忽略 build/ 目录下的所有文件
    build/
    # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
    doc/*.txt

2.5 查看已暂存和未暂存的更新

git diff工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容

git diff --cached 查看已经暂存起来的变化

$ git diff --cached
    diff --git a/benchmarks.rb b/benchmarks.rb
    index 3cb747f..e445e28 100644
    --- a/benchmarks.rb
    +++ b/benchmarks.rb
    @@ -36,6 +36,10 @@ def main
    @commit.parents[0].parents[0].parents[0]
    end

    + run_code(x, 'commits 1') do
    + git.commits.size
    + end
    +
    run_code(x, 'commits 2') do
    log = git.commits('master', 15)
    log.size

2.6 git commit 提交

将文件从以上生命周期图staged 状态变成 unmodified状态

git commit -a会自动把所有已经跟踪过的文件暂存起来一并提交,跳过 git add 步骤


2.7 git rm <file> 移除

要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。

#如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
$:~/my-git/my-clone/my-git$ git rm file
error: the following file has changes staged in the index:
    file
(use --cached to keep the file, or -f to force removal)

$:~/my-git/my-clone/my-git$ rm file #物理删除
$:~/my-git/my-clone/my-git$ git status
Changes to be committed:
        new file:   file
Changes not staged for commit:
        deleted:    file


$:~/my-git/my-clone/my-git$ git rm file #魔法删除
rm 'file'

$:~/my-git/my-clone/my-git$ git status
No commits yet

git rm --cached

我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆 .a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 --cached 选项即可


2.8git mv file_from file_to 移动/更名

可被git识别为renamed,等效于

$ mv README.txt README
$ git rm README.txt
$ git add README


3. 查看提交历史 git log

-p 选项展开显示每次提交的内容差异,用 -n 则仅显示最近的n次更新

--stat,仅显示简要的增改行数统计

--pretty 选项: oneline 将每个提交放在一行显示 ; 另外还有shortfullfuller

format,可以定制要显示的记录格式

  • %H 提交对象(commit)的完整哈希字串
    %h 提交对象的简短哈希字串
    %T 树对象(tree)的完整哈希字串
    %t 树对象的简短哈希字串
    %P 父对象(parent)的完整哈希字串
    %p 父对象的简短哈希字串
    %an 作者(author)的名字
    %ae 作者的电子邮件地址
    %ad 作者修订日期(可以用 -date= 选项定制格式)
    %ar 作者修订日期,按多久以前的方式显示
    %cn 提交者(committer)的名字
    %ce 提交者的电子邮件地址
    %cd 提交日期
    %cr 提交日期,按多久以前的方式显示
    %s 提交说明

用 oneline 或 format 时结合 --graph 选项,可以看到开头多出一些 ASCII 字符串表示的简单图形

$ git log --pretty=format:"%h %s" --graph
    * 2d3acf9 ignore errors from SIGCHLD on trap
    * 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
    |\
    | * 420eac9 Added a method for getting the current branch.
    * | 30e367c timeout code and tests
    * | 5a09431 add timeout protection to grit
    * | e1193f8 support for heads with slashes in them
    |/
    * d6016bc require time for xmlschema
    * 11d191e Merge branch 'defunkt' into local

选项 说明
-p 按补丁格式显示每个更新之间的差异。
–stat 显示每次更新的文件修改统计信息。
–shortstat 只显示 --stat 中最后的行数修改添加移除统计。
–name-only 仅在提交信息后显示已修改的文件清单。
–name-status 显示新增、修改、删除的文件清单。
–abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
–relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。
–graph 显示 ASCII 图形表示的分支合并历史。
–pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。


4. 撤销

4.1 git commit --amend修改提交
$ git commit -m 'initial commit'
    $ git add forgotten_file
    $ git commit --amend

三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容


4.2 git reset HEAD <file>... 取消已经暂存的文件

将文件从 Changes to be committed 移到 Changes not staged for commit

$:~/my-git/my-clone/my-git$ git add readme.md
$:~/my-git/my-clone/my-git$ git status
On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   file
        new file:   readme.md

$:~/my-git/my-clone/my-git$ git reset -- readme.md
$:~/my-git/my-clone/my-git$ git status
On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   file

4.3 git checkout -- <filename>取消对文件的修改
$:~/my-git/my-clone/my-git$ echo 'hhh' > file
$:~/my-git/my-clone/my-git$ git status
On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   file
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   file
        
$:~/my-git/my-clone/my-git$ git checkout -- file
$:~/my-git/my-clone/my-git$ git status
On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   file

5. 远程仓库

5.1 添加远程仓库

git remote add [shortname] [url]


5.2 从远程仓库抓取数据到本地

git fetch [remote-name]从远程仓库中拉取所有本地仓库中还没有的数据

运行完成后,你就可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地,或者只是取出某个分支。


如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。所以,git fetch origin
会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)。有一点很重要,需要记住,fetch
命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。


如果设置了某个分支用于跟踪某个远端仓库的分支,可以使用 git pull
命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。在日常工作中我们经常这么用,既快且好。实际上,默认情况下git clone 命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master
分支)。所以一般我们运行 git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。


5.3 推送数据到远程仓库

git push [remote-name(origin)] [branch-name(master)]将本地仓库中的数据推送到远程仓库

只有在所克隆的服务器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务。如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回。你必须先把他们的更新抓取到本地,合并到自己的项目中,然后才可以再次推送


5.4 查看远程仓库信息git remote show [remote-name]
$ git remote show origin
    * remote origin
    URL: git://github.com/schacon/ticgit.git
    Remote branch merged with 'git pull' while on branch master
    master
    Tracked remote branches
    master
    ticgit

5.5 远程仓库的删除和重命名

git remote rename <OldName> <NewName>命令修改某个远程仓库在本地的简称.

git remote rm <repositoryName>删库跑路


6.标签

Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。


6.1 含附注的标签

git tag -a v1.4 -m 'my version 1.4'

-a 即annotated含附注的
-m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中
可以使用 git show命令查看相应标签的版本信息,并连同显示打标签时的提交对象

如果你有自己的私钥,还可以用 GPG 来签署标签,只需要把之前的 -a 改为-s(译注: 取 signed 的首字母)即可


6.2 轻量级标签

实际上就是一个保存着对应提交对象的校验和信息的文件。要创建这样的标签,一个 -a,-s 或 -m 选项都不用,直接给出标签名字即可:


6.3 分享标签

默认情况下git push 并不会把标签传送到远端服务器上,显式命令格式如同推送分支,运行 git push origin [tagname]即可

$ git push origin --tags
#推送所有标签

git命令别名
$ git config --global alias.ci commit
现在,如果要输入 git commit 只需键入 git ci 即可


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值