Git入门到高级系列2-git高级操做

视频课程地址

腾讯课堂javascript

git 清理

git clean命令用来从你的工做目录中删除全部没有tracked过的文件。php

命令 说明
git clean -n 告诉你哪些文件会被删除. 记住他不会真正的删除文件, 只是一个提醒。
git clean -d 删除未跟踪的目录
git clean -f 删除当前目录下全部没有track过的文件。忽略文件不被删除!
git clean -df -d表明删除目录,-f强制删除。
git clean -xf 删除当前目录下全部没有track过的文件. 无论他是不是.gitignore文件里面指定的文件夹和文件
git clean -X 删除全部被忽略的文件

若是被删除的子文件夹中有 .git目录,那么会被忽略掉,若是想删除必须添加-f参数。java

好比实例:让当前工做目录回滚到上一次提交的情况,新添加的文件也被删除掉。git

# 让暂存区和工做目录把已经被跟踪的文件清理干净 $ git reset --hard # 让未追踪的文件进行清理 $ git clean -f 

git分支管理

项目分支就是版本库的一个副本,有了分支后能够把你的工做从开发主线上分离开来, 以避免影响开发主线。github

建立分支

建立分支: git branch 分支名字命令,切换分支的命令使用 git checkout 分支名字shell

$ git branch dev
$ git checkout dev

# -b建立分支,checkout是切换分支 $ git checkout -b dev 

删除分支

当一个分支完成了使命的时候,通常咱们会把它删除掉。ruby

# -d 命令是删除的意思,delete $ git branch -d hotfix 

查看全部的分支

$ git branch -v
  dev    eba9a31 update the a.txt by dev
* master d47fbfb update the a.txt by master;

带*的表明是当前的分支。bash

合并分支

合并分支就是把其余分支的代码合并到当前的分支中。git会自动将当前分支和要合并的分支找到共同的基点,而后将当前分支的全部变化和要合并分支的变化进行三方合并,并产生一个新的提交,这次提交有两个父提交。服务器

例如操做:网络

# 进入主分支 $ git checkout master # 合并dev分支 $ git merge dev 

合并分支:

  • 合并分支前,确保当前分支已经提交状态

  • 快速合并: 若是两个分支之间没有分叉,要被合并的分支提交比当前分支更新,那么只是HEAD指针的移动。

  • 冲突解决: 若是合并的两个分支有分叉,那么自动添加一个新的提交,若是有冲突须要先解决完冲忽然后再提交。

解决冲突的办法:就是移除代码中的特殊符号,留下本身想要的代码。好比:冲突文件以下:

ssss
<<<<<<< HEAD 22222222 33333333 44444444 ======= devdevdevdev >>>>>>> dev 

移除上面的 <<<<<<< HEAD 和 ======= >>>>>>> dev而后留下本身想要的代码就完成了冲突解决,最后add和commit一下就能够了。

完整的解决冲突的流程:

# 切换到主分支 $ git checkout master # 把dev分支的内容合并到主分支 $ git merge dev # 若是产生冲突后,先修改文件,去掉冲突的符号。 # 最后提交修改到仓库 $ git add . $ git commit -m '合并冲突' 

合并过程当中,随时均可以中止合并,只须要 git merge abort ,仓库和工做去会回到合并以前的状态。

git标签

Git 能够给历史中的某一个提交打上标签。 比较有表明性的是人 们会使用这个功能来标记发布结点(v1.0 等等)。

列出标签

在 Git 中列出已有的标签是很是简单直观的。 只须要输入 git tag:

$ git tag
v0.1 v1.3 

这个命令以字母顺序列出标签;

你也可使用特定的模式查找标签,若是只对 1.8.5 系列感兴趣,能够运行:

$ git tag -l 'v1.8.5*' v1.8.5 v1.8.5-rc0 v1.8.5-rc1 v1.8.5-rc2 v1.8.5-rc3 v1.8.5.1 v1.8.5.2 v1.8.5.3 v1.8.5.4 v1.8.5.5 

建立标签

Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)。 一个轻量标签很像一个不会改变的分支 - 它只是一个特定提交的引用。

  • 注标签

在 Git 中建立一个附注标签是很简单的。 最简单的方式是当你在运行 tag 命令时指定 -a 选项:

$ git tag -a v1.4 -m 'my version 1.4' $ git tag v0.1 v1.3 v1.4 

-m 选项指定了一条将会存储在标签中的信息。

经过使用git show命令能够看到标签信息与对应的提交信息:

$ git show v1.4 tag v1.4 Tagger: Ben Straub <ben@straub.cc> Date: Sat May 3 20:19:12 2014 -0700 my version 1.4 commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number 

输出显示了打标签者的信息、打标签的日期时间、附注信息,而后显示具体的提交信息。

  • 轻量标签

另外一种给提交打标签的方式是使用轻量标签。 轻量标签本质上是将提交校验和存储到一个文件中 - 没有保存任 何其余信息。 建立轻量标签,不须要使用 -a、-s 或 -m 选项,只须要提供标签名字:

$ git tag v1.4-lw $ git tag v0.1 v1.3 v1.4 v1.4-lw v1.5 

后期打标签

你也能够对过去的提交打标签。

$ git tag -a v1.2 9fceb02 

检出标签

在 Git 中你并不能真的检出一个标签,由于它们并不能像分支同样来回移动。 若是你想要工做目录与仓库中特定 的标签版本彻底同样,可使用git checkout -b [branchname] [tagname]在特定的标签上建立一个 新分支:

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2' 

固然,若是在这以后又进行了一次提交,version2 分支会由于改动向前移动了,那么 version2 分支就会和 v2.0.0 标签稍微有些不一样,这时就应该小心了。

变基

变基的基本操做

rebase 命令将提交到某一分支上的全部修改都移至另外一分支上,就好像“从新 播放”同样。翻译成通俗的话: 找到参照的仓库和当前的仓库的相同的提交,而后把当前分支后续的提交挪动到参照仓库的提交的最后,造成一条线性的提交顺序。

例如:experiment分支参照master分支进行变基

 
变基以前
$ git checkout experiment
$ git rebase master
 
变基以后

远程分支的pull命令的时候的--base能够直接变基合并

改变提交历史

修改多个提交信息.若是想要修改最近三次提交信息,或者那组提交中的任意一个提交信息,将想要修改的最近一次提交的父 提交做为参数传递给git rebase -i命令,即HEAD2^或HEAD3。记住~3可能比较容易,由于你正尝试 修改最后三次提交;

$ git rebase -i HEAD~3 

此时会进入vi的编辑器模式,这是须要你了解一点vi的快捷键否则无法继续操做。

pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file # Rebase 710f0f8..a5f4a0d onto 710f0f8 # # Commands: # p, pick <commit> = use commit # r, reword <commit> = use commit, but edit the commit message # e, edit <commit> = use commit, but stop for amending # s, squash <commit> = use commit, but meld into previous commit # f, fixup <commit> = like "squash", but discard this commit's log message # x, exec <command> = run command (the rest of the line) using shell # d, drop <commit> = remove commit # l, label <label> = label current HEAD with a name # t, reset <label> = reset HEAD to a label # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>] # . create a merge commit using the original merge commit's # . message (or the oneline, if no original merge commit was # . specified). Use -c <commit> to reword the commit message. # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. 

把最上面的pick对应改为你想要的效果,好比删除某个提交信息,则把pick改为 d为删除当前提交信息,e是修改,p默认就留下

git远程仓库

远程仓库是指托管在因特网或其余网络中 的你的项目的版本库。

远程分支克隆

克隆远程仓库,就是把远程仓库拷贝一个副本下载到本地。

$ git clone https://github.com/malun666/aicoder_vip_doc # 本地目录会增长一个文件,就是把远程仓库下载到本地了 

查看远程仓库的远程的关联信息

$ git remote -v
origin  https://github.com/malun666/aicoder_vip_doc (fetch) origin https://github.com/malun666/aicoder_vip_doc (push) 

origin - 这是 Git 给你克隆的仓库服务器的默认名字。origin就表明远程仓库的别名。

添加远程仓库

语法:git remote add <shortname> <url>

$ cd /path/to/gitresp
$ git remote add aicoder https://github.com/malun666/aicoder_vip_doc $ git remote -v 

远程分支拉取

通常先创建好远程仓库的别名后,而后用fetch命令进行拉取远程仓库的内容。

$ git fetch <远程仓库别名> <远程分支名>
# 例如: $ git fetch origin dev # 下载全部的远程分支 $ git fetch --all 

若是你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。

远程仓库的移除与重命名

若是想要重命名引用的名字能够运行 git remote rename 去修改一个远程仓库的简写名。 例如,想要将 pb 重命名为paul,能够用git remote rename这样作:

  • 修改别名
$ git remote rename pb paul
$ git remote
origin
paul
  • 删除别名
$ git remote rm paul
$ git remote
origin

查看远程仓库详情

若是想要查看某一个远程仓库的更多信息,可使用 git remote show [remote-name]命令。

$ git remote show origin
* remote origin
  Fetch URL: git@github.com:malun666/aicoder_egg.git Push URL: git@github.com:malun666/aicoder_egg.git HEAD branch: master Remote branches: dev tracked master tracked Local branches configured for 'git pull': dev merges with remote dev master merges with remote master Local refs configured for 'git push': dev pushes to dev (up to date) master pushes to master (up to date) 

推送到远程仓库

当你想分享你的项目时,必须将其推送到上游。 这个命令很简单:git push [remote-name] [branch-name]。 当你想要将 master 分支推送到 origin 服务器时(再次说明,克隆时一般会自动帮你设置好那两个 名字),那么运行这个命令就能够将你所作的备份到服务器

具体语法:

$ git push <远程主机名> <本地分支名>:<远程分支名> 

实例:

$ git push origin master

只有当你有所克隆服务器的写入权限,而且以前没有人推送过期,这条命令才能生效。

注意推送以前,必须先把远程分支的最新内容拉取下来合并或者变基成为最新的内容才能够推送。

设置关联,自动推送。

第一次执行推送的时候,添加 -u参数,例如:

$ git push -u origin master
# 后续的推送,就直接使用 git push便可,已经关联无需再指定 origin和master 

远程分支拉取与合并

拉取以前,确保当前仓库为提交完成状态。

拉取全部的远程分支:

$ git fetch --all
$ git branch --all
# 此时能够看到全部的远程分支和当前分支内容 aicoder * master remotes/origin/HEAD -> origin/master remotes/origin/aicoder remotes/origin/master 

此时remotes开头的都是远程的分支的最新的内容,能够用merge命令进行合并分支,也能够rebase变基。

例如:

# 切换到aicoder分支 $ git checkout aicoder # 合并远程的aicoder分支 $ git merge remotes/origin/aicoder 

以上操做都太麻烦,最简单的办法就是直接使用pull命令,是以上fetch命令和merge命令的合体:

# 获取远程的aicoder分支并与当前的aicoder分支进行合并。 $ git pull origin aicoder # 若是合并的不一样分支名字: 最后须要用 远程分支名:本地分支名 # $ git pull <远程主机名> <远程分支名>:<本地分支名> $ git pull origin aicoder:master 

若是合并过程当中有任何的冲突,须要手动修改冲突代码,最后git add 和git commit提交。

远程分支拉取与变基

远程拉取和合并能够只用git pull命令,变基也是能够的。

git pull --rebase origin master
# 简写 git pull -r origin master # 从远程origin的master分支上拉取最新的结果而且让当前仓库依照远程仓库进行变基操做。 

变基过程当中能够随时进行 abort中止。

github

GitHub 是最大的 Git 版本库在线托管商,是一个免费托管开源项目的远程仓库,非开源项目收费。

注册帐号

直接访问 https://github.com

配置SSH 访问

第一步:登陆github 第二步:点击github右上角头像,弹出菜单选择setting,而后选择SSH and GPG keys菜单,点击 New SSH Key按钮.

 
设置ssh key

第三步:找到以前生成的ssh的公钥 打开终端或者命令行(gitbash)

$ cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/ssdfsfsdfadfadfasdfasdfaslajfdaljADFASdfkasdflasjflasjdflajA23ljlsdjfaljf 

~/.ssh/id_rsa.pub文件中的内容拷贝到github的秘钥框中。以下图所示:

 
设置ssh key

github 建立仓库并设置管理

在github的网站顶部点击 加号按钮。

 
设置ssh key

 

 

而后输入仓库的名字和仓库的描述。

 
设置ssh key

好的此时远程仓库建立好了,而后就能够进行远程关联和推送和拉取工做。

例如:

在本地新建仓库并进行关联:

echo "# gitlearn" >> README.md git init git add README.md git commit -m "first commit" git remote add origin git@github.com:malun666/gitlearn.git git push -u origin master 

在本地已有的仓库上进行关联:

git remote add origin git@github.com:malun666/gitlearn.git git push -u origin master 

git工做流

详情请参考: Git工做流指南

git集中式工做流

集中式工做流以中央仓库做为项目全部修改的单点实体。相比SVN缺省的开发分支trunk,Git叫作master,全部修改提交到这个分支上。

 
设置ssh key
  • 全部成员都以中央仓库为基础进行clone
  • 全部成员代码提交到本地仓库,进行远程推送前先进行获取最新解决冲突后再push
  • 能够选择merge模式也能够rebase模式

基本的开发模式:

  1. 项目维护者推送到主仓库。
  2. 贡献者克隆此住仓库,作出修改。
  3. 贡献者将数据推送到本身的公开仓库。
  4. 贡献者给维护者发送邮件,请求拉取本身的更新。
  5. 维护者在本身本地的仓库中,将贡献者的仓库加为远程仓库并合并修改。
  6. 维护者将合并后的修改推送到主仓库。
 
集中式工做流

进入公司后,须要问项目经理要一下公司的源码git仓库的地址,以及把本身的公钥给管理员,让他们帮你设置上权限,就能够clone项目了。

本工做流比较简单,就再也不概述。

github的fork工做流

派生(Fork)项目,若是你想要参与某个项目,可是并无推送权限,这时能够对这个项目进行“派生”。 派生的意思是 指,GitHub 将在你的空间中建立一个彻底属于你的项目副本,且你对其具备推送权限。

流程一般以下:

  1. 从 master 分支中建立一个新分支
  2. 提交一些修改来改进项目
  3. 将这个分支推送到 GitHub 上
  4. 建立一个合并请求(pr)
  5. 讨论,根据实际状况继续修改
  6. 项目的拥有者合并或关闭你的合并请求
 
github-fork工做流

项目分支管理模型

通常一个完整的项目都会有不少分支,每一个分支都有一些管理的规则。

 
设置ssh key

如何删除远程分支

# 把一个空分支推送到远程的dev分支,也就是删除远程的dev分支 $ git push origin :dev 

git的钩子与自动化集成

Git 能在特定的重要动做发生时触发自定义脚本。这些特定的能注册执行脚本的事件就称为钩子。

客户端钩子

客户端钩子分为不少种。 下面把它们分为:提交工做流钩子、电子邮件工做流钩子和其它钩子。

提交钩子

钩子名 做用
pre-commit 钩子在键入提交信息前运行。 它用于检查即将提交的快照,例如,检查是否有所遗漏,确保测试 运行,以及核查代码。 若是该钩子以非零值退出,Git 将放弃这次提交,不过你能够用 git commit --no -verify 来绕过这个环节。 你能够利用该钩子,来检查代码风格是否一致(运行相似 lint 的程序)、尾随空 白字符是否存在(自带的钩子就是这么作的),或新方法的文档是否适当。
prepare-commit-msg 钩子在启动提交信息编辑器以前,默认信息被建立以后运行。 它容许你编辑提交者所 看到的默认信息。 该钩子接收一些选项:存有当前提交信息的文件的路径、提交类型和修补提交的提交的 SHA- 1 校验。 它对通常的提交来讲并无什么用;然而对那些会自动产生默认信息的提交,如提交信息模板、合并提 交、压缩提交和修订提交等很是实用。 你能够结合提交模板来使用它,动态地插入信息。
commit-msg 钩子接收一个参数,此参数即上文提到的,存有当前提交信息的临时文件的路径。 若是该钩子脚本以非零值退出,Git 将放弃提交,所以,能够用来在提交经过前验证项目状态或提交信息。 在本章的最后一节,咱们将展现如何使用该钩子来核对提交信息是否遵循指定的模板。
post-commit 钩子在整个提交过程完成后运行。 它不接收任何参数,但你能够很容易地经过运行 git log -1 HEAD来得到最后一次的提交信息。该钩子通常用于通知之类的事情。

例如: git提交的标签工具

An emoji guide for your commit messages. 😜

其余钩子请直接参考官网。

服务器端钩子

服务器端的钩子能够帮我作不少事情,好比检测到提交好自动执行某些自动化部署的脚本,就能实现自动化的部署和提交。 全部服务器端的工做都将在你的 hooks 目录下的 update 脚本中完成。 update 脚本会为每个提交的分支各 运行一次,它接受三个参数:

  • 被推送的引用的名字
  • 推送前分支的修订版本(revision)
  • 用户准备推送的修订版本(revision)

例如:

 
git钩子

git其余

git命令别名

Git 并不会在你输入部分命令时自动推断出你想要的命令。 若是不想每次都输入完整的 Git 命令,能够经过 git config 文件来轻松地为每个命令设置一个别名。 这里有一些例子你能够试试:

$ 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 config --global alias.lf 'log --graph --oneline' # 使用: $ git lf # 等价于: $ git log --graph --oneline 

git服务器端私有部署及权限管理

请直接参考: CentOS搭建Git服务器及权限管理

搭建gitlab

直接参考:4.8 服务器上的 Git - GitLab

做业

git stash命令

视频课程地址

腾讯课堂

相关文章
相关标签/搜索