Git:学习笔记


一、概述

下载地址:GitGit客户端

二、git config(配置)

返回目录

Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:

  1. /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果在执行 git config 时带上 --system 选项,那么它就会读写该文件中的配置变量。 (由于它是系统配置文件,因此你需要管理员或超级用户权限来修改它。)

  2. ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 你可以传递 --global 选项让 Git 读写此文件,这会对你系统上 所有 的仓库生效。

  3. 当前使用仓库的 Git 目录中的 config 文件(即 .git/config):针对该仓库。 你可以传递 --local 选项让 Git 强制读写此文件,虽然默认情况下用的就是它。。 (当然,你需要进入某个 Git 仓库中才能让该选项生效。)

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

1. 查看 config

返回目录

#查看配置
git config --list

#查看所有的配置以及其所在的文件
git config --list --show-origin

2. 设置用户信息

返回目录

#设置全局用户信息
git config --global user.name "John Doe"
git config --global user.email [email protected]

#设置项目用户信息
git config user.name "John Doe"
git config user.email [email protected]

三、Git的使用

1. 本地仓库

返回目录

#0. 克隆仓库
git clone <url>

#1. 创建本地仓库
#该命令将创建一个名为 .git 的子目录
git init

#2. 追踪(暂存)文件 
git add <file>
git add *.c #追踪所有.c的文件

#3. 提交追踪(暂存)的文件到仓库
git commit -m 'text' #-m 表示此次提交的说明
git commit -a -m 'text' #-a 会自动把所有已经跟踪过的文件暂存起来一并提交

#3.1 修补提交,即:提交后发现忘记了暂存某些需要的修改
git commit -m 'initial commit' #忘提交个文件
git add forgotten_file #添加忘记的文件
git commit --amend #修补提交,最终只会有一个提交——第二次提交将代替第一次提交的结果

#4. 检查当前文件状态
#查看哪些文件处于什么状态,是否被跟踪
git status
git status -s #查看简洁信息

#5. 查看当前与提交的区别
#只显示尚未暂存的改动,未跟踪的文件不显示
git diff <filename>
#查看已暂存的将要添加到下次提交里的内容
git diff --staged #或 --cached

#6. 删除文件
#6.1 从"提交"中删除,并删除该文件。但不能删除“暂存”和“未跟踪”的文件
git rm <file>
#6.2 从"提交"或“暂存”中删除,并删除该文件。但不能删除“未跟踪”的文件
git rm -f <file>
#6.3 只从"提交"或“暂存”中删除,不删除文件。但不能删除“未跟踪”的文件
git rm --cached <file>
#6.4 使用 glob 模式
git rm log/\*.log #删除 log/ 目录下扩展名为 .log 的所有文件
git rm \*~ #删除所有名字以 ~ 结尾的文件

#7. 文件改名
git mv file_from file_to

#8. 取消暂存
git reset HEAD <file>
#回滚
#HEAD^ 上个版本; HEAD^^ 再上一个版本; HEAD~1000 为之前的1000个版本
git reset --hard HEAD^ 
#不用参数就用 git log 命令中查询到的 版本号 来控制回滚

#9. 撤消对文件的修改
#会用暂存区全部或指定的文件替换工作区的文件
#这个操作很危险,会清除工作区中未添加到暂存区的改动
git checkout -- <file>

#查看执行过的git命令
git reflog

2. 远程仓库

返回目录

#1. 查看所有的远程仓库
git remote -v #默认名称是 origin。如远程仓库为多个,将会全部列出

#2. 添加远程仓库
git remote add <shortname> <url> #用 shortname 来代替整个 URL

#3. 从远程仓库中拉取
#访问远程仓库,从中拉取所有本地还没有的数据。
#执行完成后,将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
git fetch <remote>

#4. 从远程仓库中抓取
#自动抓取后合并该远程分支到当前分支
git pull

#5. 推送到远程仓库
git push <remote> <branch>

#6. 查看某一个远程仓库的信息
git remote show <remote>

#7. 重命名远程仓库
git remote rename <remote> <newname>

#8. 删除远程仓库
git remote remove <remote>

3. 标签

返回目录

Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)

#1. 查看标签
git tag
git tag -l "v1.8.5*" #查看某一系列的标签

#2. 创建轻量标签
git tag <tag>

#3. 创建附注标签
git tag -a <tag> -m "msg"

#4. 查看标签详细信息
git show <tag>

#5. 对已提交的操作打标签
git tag -a <tag> <commitHash>

#6. 推送标签
git push <remote> <tag>
git push <remote> --tags #推送所有标签

#7. 删除标签
git tag -d <tag>

#8. 删除远程的标签
git push <remote> :refs/tags/<tag>
git push <remote> --delete <tag>

#9. 检出标签
#如做了某些更改然后提交,标签不会发生变化,
#但新提交将不属于任何分支,并且将无法访问,
#除非通过确切的提交哈希才能访问。
git checkout <tag>
#建议创建一个新的分支

4. 分支

返回目录

#1. 创建分支
git branch <branch>

#2. 分支切换
git checkout <branch>
#2.1 创建并切换到新分支
git checkout -b <branch>

#3. 查看分支历史
git log --oneline --decorate --graph --all

#4. 查看分支
git branch -a #查看所有分支
git branch -v #查看每一个分支的最后一次提交
git branch --merged #查看已经合并到当前分支的分支
git branch --no-merged #查看尚未合并到当前分支的分支
git branch -vv #查看设置的所有跟踪分支

#5. 合并分支
#如有冲突,Git用
#<<<<<<<
#当前分支内容
#=======
#合并分支的内容
#>>>>>>>
#标记出不同分支的内容
git merge <branch> #将别的分支合并到本分支
git merge --no-ff -m "merge with no-ff" <branch> #--no-ff 表示禁用快速合并

#6. 变基
#将本分支变基到其它分支。相当于提交到其它分支上,使提交树更简洁。
#其它分支并未改变,还需要进行切换、合并操作。
#准则:如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。
git rebase <branch>
#图1:c1<-c2<-c5<-c6(master)
#         \<-c3<-c4<-c10(server)
#             \<-c8<-c9(client)
git rebase --onto master server client #将 client 的修改变基到 master 分支上
#图2:c1<-c2<-c5<-c6(master)<-'c8<-'c9(client)
#         \<-c3<-c4<-c10(server)
git checkout master #切换到 master 分支
git merge client #合并 client 分支到 master 分支
#图3:c1<-c2<-c5<-c6(master)<-'c8<-'c9(master、client)
#         \<-c3<-c4<-c10(server)
git rebase master server #再将 server的修改变基到 master 分支上
#图4:c1<-c2<-c5<-c6(master)<-'c8<-'c9(master、client)<-'c3<-'c4<-'c10(server)
#记住:只对尚未推送或分享给别人的本地修改执行变基,从不对已推送至别处的提交执行变基

#7. 删除分支
git branch -d <branch>

5. 远程分支

返回目录

#远程分支以 <remote>/<branch> 命名

#1. 检出远程分支
git checkout -b <branch> <remote>/<branch>
#检出远程分支,并且本地分支与远程分支名称相同
git checkout --track <remote>/<branch>

#2. 推送到远程分支
git push <remote> <branch>
#将本地的分支推送到远程仓库上的另一个分支
git push <remote> <branch>:<otherbranch>

#3. 设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者想要修改正在跟踪的上游分支
git branch -u <remote>/<branch>
git branch --set-upstream <branch> <remote>/<branch>

#4. 删除远程分支
git push <remote> --delete <branch>

6. 查看提交历史

返回目录

  1. git log查看推送日志,输入字母q退出
    不传入任何参数的默认情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面。

    -p 或 --patch 会显示每次提交所引入的差异

    git log -p -2 #-2表示显示最近的两条提交
    

    –stat 会显示每次提交的简略统计信息

    git log --stat
    

    –pretty=oneline|short|full|fuller|format

    #每个提交放在一行显示
    git log --pretty=oneline
    #short、full 和 fuller 显示的信息长度不一样
    git log --pretty=short
    #自定义输出 
    git log --pretty=format:"%h - %an, %ar : %s"
    
  2. git log --pretty=format常用的选项

    选项 说明
    %H 提交的完整哈希值
    %h 提交的简写哈希值
    %T 树的完整哈希值
    %t 树的简写哈希值
    %P 父提交的完整哈希值
    %p 父提交的简写哈希值
    %an 作者名字
    %ae 作者的电子邮件地址
    %ad 作者修订日期(可以用 --date=选项 来定制格式)
    %ar 作者修订日期,按多久以前的方式显示
    %cn 提交者的名字
    %ce 提交者的电子邮件地址
    %cd 提交日期
    %cr 提交日期(距今多长时间)
    %s 提交说明
  3. git log的常用选项

    选项 说明
    -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(用来定义自己的格式)。
    –oneline –pretty=oneline --abbrev-commit 合用的简写。
  4. 过滤 git log 输出的选项

    选项 说明 示例
    -<n> 仅显示最近的 n 条提交 显示最近的两条提交
    git log -2
    –since, --after 仅显示指定时间之后的提交 显示最近两周的所有提交
    git log --since=2.weeks
    可以是 "2008-01-15"的某一天
    可以是 “2 years 1 day 3 minutes ago” 的相对日期
    –until, --before 仅显示指定时间之前的提交 同上
    –author 仅显示作者匹配指定字符串的提交
    –committer 仅显示提交者匹配指定字符串的提交
    –grep 仅显示提交说明中包含指定字符串的提交 如果添加了 –all-match 选项, 则只会输出 所有 匹配 --grep 模式的提交
    -S 仅显示添加或删除内容匹配指定字符串的提交
    –no-merges 隐藏合并提交

7. 忽略文件

返回目录

  1. git 用 .gitignore 文件来标记忽略的文件。其格式规范如下:
    a)所有空行或者以 # 开头的行都会被 Git 忽略
    b)可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中
    c)匹配模式可以以(/)开头防止递归
    d)匹配模式可以以(/)结尾指定目录
    e)要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反

  2. 创建 .gitignore 文件

    #忽略所有以 .o 或 .a 结尾的文件
    *.[oa]
    
    #忽略所有名字以波浪符(~)结尾的文件
    *~
    
    # 忽略所有的 .a 文件
    *.a
    
    # 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
    !lib.a
    
    # 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
    /TODO
    
    # 忽略任何目录下名为 build 的文件夹
    build/
    
    # 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
    doc/*.txt
    
    # 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
    doc/**/*.pdf
    

GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore文件列表

四、分支管理策略

返回目录

  • 主分支 master
    代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。
    Git主分支的名字,默认叫做Master。它是自动建立的,版本库初始化以后,默认就是在主分支在进行开发。
  • 开发分支 develop
    主分支只用来分布重大版本,日常开发应该在另一条分支上完成。我们把开发用的分支,叫做Develop。
    这个分支可以用来生成代码的最新代码版本。如果想正式对外发布,就在Master分支上,对Develop分支进行"合并"(merge)。
  • 功能分支 feature
    功能分支,它是为了开发某种特定功能,从Develop分支上面分出来的。开发完成后,要再并入Develop。
    功能分支的名字,可以采用feature-*的形式命名。
  • 预发布分支 release
    预发布分支,它是指发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。预发布分支是从Develop分支上面分出来的,预发布结束以后,必须合并进Develop和Master分支。它的命名,可以采用release-*的形式。
  • bug 分支 fixbug
    bug分支。软件正式发布以后,难免会出现bug。这时就需要创建一个分支,进行bug修补。修补bug分支是从Master分支上面分出来的。修补结束以后,再合并进Master和Develop分支。它的命名,可以采用fixbug-*的形式。
  • 其它分支 other
    根据需要创建即可

五、搭建Git服务器

返回目录

  1. 用yum安装git服务器

    cd src/
    wget http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
    rpm -ivh epel-release-5-4.noarch.rpm
    Preparing...                ########################################### [100%]
        package epel-release-5-4.noarch is already installed
    yum list
    yum install -y git
    
  2. 创建一个git用户,用来运行git服务

    adduser git
    
  3. 创建客户端登录证书
    注,收集所有需要登录的用户的公钥,就是他们自己生成的id_rsa.pub文件,把所有公钥复制到/home/git/.ssh/authorized_keys文件里,一行一个。

    1. 客户端生成id_rsa.pub文件的命令
      ssh-keygen -t rsa
      cat  .ssh/id_rsa.pub
      ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NwUHeNNi+PC6KlrcJrXXDmKxRMmgHIPp79sgX6zqfdSlmNj7rBPQeyEKS9Wg8yI6jd8aG2jsUx99Vjti2VK2vEXKkRHxwID7ri69gE71RfDtv6ekafnzLo14J8hAp0spMk+N3wEAQRYDmcYo1wmnm/jMBedGrHj4NJQ1vYy1hVtJasGMSzjcMrlz9qvaluWnQ5tQjKFQVVwKsRRRzs8qTvzVhLJt4NQ+CAN45tqfsRuf58Uba9QNK7/6xSUiIKXQiILz8PMGJ3MnlV+eN3wx2aeztdevxu9plggtG05SMmd8GNVzXrN1IaxXSvz0UwjQ2kygu7aCqO8AZWH49rouw== leo@LEO-PC
      
    2. 查看服务器上authorized_keys文件
      [root@git ~]# cat /home/git/.ssh/authorized_keys
      ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwMU4FKB6NRc3XSoIunWsdvVVuSoncbVb5Al6lB3ciswBVd++YmJFhqwkITNGccrO5sycROs9+Fbjgd6oBSzNuaBtCIbwNNsEyM/henTl2euI3XsnJQ/ITr6c/q0P3WoGl4E2QFQ2kZqs+1eDC0CgHcBrqvFv1Jr414sVYK9lfZwIF+jDdtaBOrSJuq1Agx9pGUFUEB4tQfkXxsWm/MvOmKAVvduKDE1eenUEL9zzyeELPcSXLe3NOoTjZhkX6EEXxQR1ZiZRFywLpfM4qopZ10to2KIUyVtzw6hx6V3cg7kn40lYVW0EAMATw9dVldwcRUI+kJzJSKUTKDVSwY3/+Q== root@CHENMINGQIAN
      ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsmmJuR+KhRSpdSirCiL30RA8WbfgicY1z7itWVnKHJW6hTuJFhzruY59FilVjJR1hbQBluP9JnK3XPSK9PSg+bwiJ2iQRa39rXck35r+trVOLyNbPyfKVRfOemD8YuykMlyr5JeW8gZjsHEuLnJ8//RiCiYzd3RT/SSUQ4yawDoIIWkz3eUSL09xoCRZFBsAp+S/LD3vx2MN+FNOHwvqcE+yK3oRNIqjWwLoKE0e5TRnqNgrPQ95PJYB3XPUulzaeMwsWPZs7jIUMl/5yEqSgAkioa8SVMOsikYJG/erv99NNVgFmpCBIiWqKEGkNrIpYzLLHDSYQ4g5Gbci/RZ54Q== Administrator@WIN2003X323
      ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NwUHeNNi+PC6KlrcJrXXDmKxRMmgHIPp79sgX6zqfdSlmNj7rBPQeyEKS9Wg8yI6jd8aG2jsUx99Vjti2VK2vEXKkRHxwID7ri69gE71RfDtv6ekafnzLo14J8hAp0spMk+N3wEAQRYDmcYo1wmnm/jMBedGrHj4NJQ1vYy1hVtJasGMSzjcMrlz9qvaluWnQ5tQjKFQVVwKsRRRzs8qTvzVhLJt4NQ+CAN45tqfsRuf58Uba9QNK7/6xSUiIKXQiILz8PMGJ3MnlV+eN3wx2aeztdevxu9plggtG05SMmd8GNVzXrN1IaxXSvz0UwjQ2kygu7aCqO8AZWH49rouw== leo@LEO-PC
      

    说明:我这里有三个用户登录服务器,所以我这里就有三个ssh-rsa,大家可以看一下。

  4. 初始化Git仓库
    注,先选定一个目录作为Git仓库,这里是/data/git/project.git。

    cd /data/git/
    git init --bare project.git
    ls
    branches  config  description  HEAD  hooks  index  info  objects  refs
    

    执行以上命令 Git命令,会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:

    chown -R git.git project.git
    ls -l
    总计 4
    drwxr-xr-x 7 git git 4096 05-09 13:50 project.git
    
  5. 禁用shell登录
    注,出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

    cat /etc/passwd | grep git
    git:x:1001:1001:git version control:/home/git:/bin/bash
    

    改为:

    vim /etc/passwd
    git:x:1001:1001:git version control:/home/git:/usr/bin/git-shell
    

    这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

  6. 克隆远程仓库
    注,现在可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:

    git clone [email protected]:/data/git/project.git
    

    注,$ git clone [email protected]:/data/git/project.git,其中git用户名,git.jjhh.com服务器,/data/git/prgject.git是仓库路径。好了,到这里服务器的搭建到这里就完成了,下面我们来安装一下客户端。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章