Git 笔记

Git 笔记

Git教程|廖雪峰的官方网站

精通Git(第2版). Pro Git, Second Edition. (强烈推荐!)

基础

入门

初始

  • 创建/初始化一个 git 仓库

    # 在某文件夹下执行
    git init
    # 执行完后,目录下多了个 .git 文件夹
    

提交

  • 暂存:把文件添加到仓库,以使此文件可被 git 追踪,或提交文件到暂存区

    git add <filename>
    
  • 提交:将修改提交到仓库

    # 必须输入信息以提交修改
    git commit -m <message>
    # 或 唤起文本编辑器编辑信息以提交修改
    git commit
    # 将工作区的修改跳过暂存区直接提交
    git commit -a
    

查看

  • 查看当前状态,可查看所在分支、涉及修改的文件

    git status
    # 精简方式查看
    git status -s
    # 显示的结果左侧有两列,左列标明文件是否暂存,右列标明文件是否修改
    
    # 如果有文件被修改,查看 filename 的修改情况
    git diff <filename>
    
  • 查看提交记录

    git log
    # 显示信息太多?可以试试下面的命令,每条记录只在一行中显示
    git log --oneline
    git log --pretty=oneline
    

回退

  • 回退

    # 回退一步
    git reset --hard HEAD^
    # 回退两步
    git reset --hard HEAD^^
    # 回退100步
    git reset --hard HEAD~100
    # 回退到指定版本
    # git reset --hard <commit>
    git reset --hard 1094a
    
  • 查看操作记录,比如可以查看回退的操作记录,回退之后反悔可用

    git reflog
    

概念

工作区(Working Directory):文件夹下能看到的目录

暂存区(stage/index):一般在 .git/index 中

版本库(Repository):指 .git 文件夹

master分支

HEAD:是指向当前分支引用的指针,它指向该分支上的最后一次提交。

          git add                git commit
           ---->                    ---->
工作区 ------------------ 暂存区 --------------- 版本库
                 <----
丢弃工作区     暂存区回到工作区
git checkout   git reset

+-------+   +-------+    +-------+
| 工作区 |   | 暂存区 |	 | 版本库 |
+-------+   +-------+    +-------+
    |           |            |
    |  git add  | git commit |
    | ========> | =========> |
    |      git checkout      |
    | <===================== |
    |       git reset        |
    | <========   <========= |

进一步

查看修改

  • 查看工作区的修改

    # 查看工作区的修改,即未暂存的修改,// 比较工作区和暂存区
    git diff
    git diff <filename>
    
  • 查看暂存区的修改

    # 查看暂存区的修改,即将会被提交的内容
    git diff --cached
    # or
    git diff --staged
    
    ???# 比较工作区和版本库
    ???git diff HEAD -- <filename>
    

撤销

  • 修改上一次的提交信息

    git commit --amend
    
  • 撤销暂存区修改

    # 撤销已暂存的文件,仅将修改由暂存区转到工作区,不会丢失修改的内容
    git reset
    git reset HEAD <filename>
    
  • 撤销工作区修改

    # 撤销工作区中对文件的修改,会丢失修改的内容
    git checkout -- <filename>
    

删除

  • 删除文件

    # (此变更即被保存到暂存区)
    # 删除文件且取消对文件的跟踪
    git rm <filename>
    # 在资源管理器中删除需使用 git add 才能得到 git rm 的效果
    
    # 仅取消对文件的跟踪,不删除文件,
    git rm --cached <filename>
    

移动文件

  • 移动文件/重命名

    git mv <file_from> <file_to>
    

远程仓库

这是与 SVN 有差别的地方

初始

  • 本地有仓库,需要关联远程仓库

    git remote add [shortname] [url]
    git remote add origin git@github.com:<github_username>/<respo_name>.git
    
  • 本地无仓库,从 github 上 clone 到本地

    git clone <git_url>
    

    Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

    Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。

    使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https

获取数据

  • fetch

    # 从远程仓库获取所有本地仓库没有的数据,需手动合并到本地
    git fetch [remote-name]
    
  • pull

    # 自动获取远程数据,并合并到本地
    # 相当于 git fetch 与 git merge 的组合
    git pull
    

推送数据

  • 第一次推送到远程仓库

    git push -u origin master
    # -u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
    
  • 以后本地提交后,推送到远程仓库

    git push origin master
    

分支

基础

查看

##查看分支列表(已合并的、未合并的)
git branch [--merged|--no-merged]
# 查看每个分支的最新提交
git branch -v

##查看图形化分支与指针的情况
git log --oneline --decorate --graph --all

创建

##创建一个名为testing的分支
# git branch [branchname] [commit]
git branch testing

切换

##切换分支
# 会使工作区目录文件发生变化,所以切换分支前必须使工作区保持干净
git checkout [branchname]

合并

##合并分支
# git merge [branchname]
# 当前在master分支,将iss53分支合并过来
git merge iss53

删除

##删除分支
git branch -d [branchname]

远程分支

远程分支是指向远程仓库的分支的指针,存于本地且无法移动,当与服务器通信时才会自动更新

表示形式:(remote)/(branch)

# 拉取本地所没有的远程更改(只拉取数据,不会自动合并)
git fetch

# 删除远程分支
git push origin --delete <branch>

变基

要整合不同的分支,最简单的办法是使用 merge 命令,merge 会对两个分支上的最新提交及其最近的共同祖先进行一次三方合并,并创建一个新的合并提交。

还有另外一种方式,即变基操作(rebase),吧某个分支上所有提交的更改在另一个分支上重现一遍。

——《精通Git》

注意:不要对已经存在于本地仓库以外的提交执行变基操作。

(另一种说法:)对本地尚未推送的更改进行变基操作,从而简化提交历史,但决不能对任何已经推送到服务器的更改进行变基操作。

总之,变基可能会带来痛苦,所以不能掌握的情况下尽量不用。

标签

  • 查看

    # 列举标签
    git tag
    # 查看某标签
    git show <tag>
    
  • 创建

    • 注释标签(annotated)(推荐)

      git tag -a <tagname> [-m <msg>]
      git tag -a v1.4 -m "my version 1.4"
      
    • 轻量标签(lightweight)

      # git tag <tagname> [commit]
      git tag v1.4-lw
      
    • 补加标签

      在之前的某次提交时添加标签

      git tag -a <tagname> <commit>
      
  • 共享标签

    git push 默认不推送标签到远程服务器上,需要手动推送

    git push origin <tagname>
    # 推送所有tag
    git push origin --tags
    
  • 检出标签

    # 在特定标签上创建一个分支
    git checkout -b [branchname] [tagname]
    git checkout -b version2 v2.0.0
    

其他

配置

Git配置级别:系统>全局>项目

系统配置:/etc/gitconfig

全局配置:~/.gitconfig 针对单个用户

项目配置:.git/config

# 显示当前的Git配置(全局的、系统的)
git config --list [--global|--system]

# 编辑Git配置文件
git config -e [--global]

# 设置提交代码时的用户信息
git config [--global] user.name "[name]"
git config [--global] user.email "[email address]"

忽略文件

.gitignore 文件

规则:

  • 空行或#开头的行会被忽略
  • 以斜杠(/)开头的模式禁止递归匹配
  • 以斜杠(/)结尾的模式表示目录
  • 以感叹号(!)开始的模式表示取反
  • 支持标准的glob模式
    • 星号(*)匹配零个或更多字符
    • 方括号([])匹配其中的任意单个字符
    • 问号(?)匹配任意单个字符

GitHub 维护了一份相当全面的 .gitignore 参考实例列表 https://github.com/github/gitignore

储藏(stash)

当想转到另一个分支,但是有不希望把工作区做了一半的工作提交,可以使用 stash 命令,将修改保存在一个包含未完成变更的栈中。

# 储藏
git stash
# 查看储藏列表
git stash list
# 应用储藏
git stash apply [stashname]
# 应用储藏并丢弃
git stash pop
# 丢弃储藏
git stash drop [stashname]
# 从储藏创建分支,并丢弃储藏
git stash bransh <stashname>

清理

清理工作区目录

# 删除没有被忽略的未跟踪文件 
git clean
# 删除没有被忽略的未跟踪文件病清空所有子目录
git clean -d
# 删除被忽略以及未跟踪的文件
git clean -x
## -n 演习模式,该选项将告诉会删除什么,可确保操作无误
# 然后使用将 -n 换成 -f 进行实际操作或 -i 交互式操作

搜索

git grep

# 在工作区中搜索 hello
git grep hello

reset 与 checkout

重置(reset)

1 工作流

reset命令执行的操作

(1) git reset --soft 移动HEAD分支的指向
(2) git reset [--mixed] 使索引看起来像HEAD
(3) git reset --hard 使工作目录看起来像索引

——《精通Git》

#使用时
# 根据选项将重置HEAD指针、暂存区、工作区
# --hard : 重置工作区【危险命令】
# commit : 指定重置的 commit,无则为上一次
git reset [--hard] [commit]
2 带路径使用
##带路径使用,重置暂存区
# //使暂存区看起来像HEAD //撤销暂存区文件 //git add 的反操作
git reset <filename>

git reset

检出(checkout)

$ git help checkout

git-checkout - Switch branches or restore working tree files

切换分支或重置工作区

# 切换分支,通过修改 HEAD 的指向目标分支实现
git checkout <branch>
# 重置工作区,参数中带有 -- 或 文件路径名
git checkout [--] <filename>
git checkout <filename>
posted @ 2019-12-15 21:39  北风卷地白草折  阅读(170)  评论(0编辑  收藏  举报