git的使用

一、git、GitHub、gitlab的概述

  一、git-版本控制工具

  Git是一款自由和开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

  Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得 BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如 最近就迁移到 Git 上来了,很多 Freedesktop 的项目也迁移到了 Git 上。

  二、GitHub-一个网站

  一个网站,提供给用户空间创建git仓储,保存用户的一些数据文档或者代码等 

  作为开源代码库以及版本控制系统,Github目前拥有140多万开发者用户。随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选方法。
如前所述,作为一个分布式的版本控制系统,在Git中并不存在主库这样的概念,每一份复制出的库都可以独立使用,任何两个库之间的不一致之处都可以进行合并。
  GitHub可以托管各种git库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性。为一个项目贡献代码非常简单:首先点击项目站点的“fork”的按钮,然后将代码检出并将修改加入到刚才分出的代码库中,最后通过内建的“pull request”机制向项目负责人申请代码合并。已经有人将GitHub称为代码玩家的MySpace。

  三、gitlab-基于Git的项目管理软件

  GitLab 是一个用于仓库管理系统的开源项目。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。

二、学习Git

  一、深入理解学习Git工作流

  深入理解学习Git工作流:http://www.cnblogs.com/xirongliu/p/4584653.html

  二、源码安装git指定版本

wget https://github.com/git/git/archive/v2.19.1.zip
unzip v2.19.1.zip
cd git/git-2.19.1/
#将其安装在“/usr/local/git”目录下,命令如下:
make prefix=/usr/local/git all
make prefix=/usr/local/git install
echo "export PATH=/usr/local/git/bin:$PATH" >>/etc/profile
tail -1 /etc/profile
. /etc/profile
git --version

  二、git命令

  1、git查看、添加、提交、找回,重置修改文件

 1 git help <command> # 显示command的help
 2 git show # 显示某次提交的内容 git show $id
 3 git co -- <file> # 抛弃工作区修改
 4 git co . # 抛弃工作区修改
 5 git add <file> # 将工作文件修改提交到本地暂存区
 6 git add . # 将所有修改过的工作文件提交暂存区
 7 git rm <file> # 从版本库中删除文件
 8 git rm <file> --cached # 从版本库中删除文件,但不删除文件
 9 git reset <file> # 从暂存区恢复到工作文件
10 git reset -- . # 从暂存区恢复到工作文件
11 git reset --hard # 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改
12 git ci <file> git ci . git ci -a # 将git add, git rm和git ci等操作都合并在一起做 git ci -am "some comments"
13          git ci -am "some comments"
14 git ci --amend # 修改最后一次提交记录
15 git commit -m #提交记录
16 git revert <$id> # 恢复某次提交的状态,恢复动作本身也创建次提交对象
17 git revert HEAD # 恢复最后一次提交的状态
     1、git revert用法
git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销
作为一次最新的提交
    * git revert HEAD                  撤销前一次 commit
    * git revert HEAD^               撤销前前一次 commit
    * git revert commit (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。
git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容
    2、git revert 和 git reset的区别 
1. git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。 
2. 在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。 
3. git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
    3、git add -A 和 git add . 的区别

  git add .git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。

  不会提交新文件(untracked file)。(git add --update的缩写)

  git add -A :是上面两个功能的合集(git add --all的缩写)

  2、查看文件diff

1 git diff <file> # 比较当前文件和暂存区文件差异 git diff
2 git diff <id1> <id2> # 比较两次提交之间的差异
3 git diff <branch1>..<branch2> # 在两个分支之间比较
4 git diff --staged # 比较暂存区和版本库差异
5 git diff --cached # 比较暂存区和版本库差异
6 git diff --stat # 仅仅比较统计信息

  3、查看提交记录

git log git log <file> # 查看该文件每次提交记录
git log -p <file> # 查看每次详细修改内容的diff
git log -p -2 # 查看最近两次详细修改内容的diff
git reflog #查看所有操作记录 git log
--stat #查看提交统计信息 tig Mac上可以使用tig代替diff和log,brew install tig

  4、远程仓库相关命令

1 查看远程仓库:$ git remote -v
2 添加远程仓库:$ git remote add [name] [url]
3 删除远程仓库:$ git remote rm [name]
4 修改远程仓库:$ git remote set-url --push[name][newUrl]
5 拉取远程仓库:$ git pull [remoteName] [localBranchName]
6 推送远程仓库:$ git push [remoteName] [localBranchName]

  5、Git 本地分支管理

    1、查看、切换、创建和删除分支
 1 git br -r # 查看远程分支
 2 git br <new_branch> # 创建新的分支
 3 git br -v # 查看各个分支最后提交信息
 4 git br --merged # 查看已经被合并到当前分支的分支
 5 git br --no-merged # 查看尚未被合并到当前分支的分支
 6 git co <branch> # 切换到某个分支
 7 git co -b <new_branch> # 创建新的分支,并且切换过去
 8 git co -b <new_branch> <branch> # 基于branch创建新的new_branch
 9 git co $id # 把某次历史提交记录checkout出来,但无分支信息,切换到其他分支会自动删除
10 git co $id -b <new_branch> # 把某次历史提交记录checkout出来,创建成一个分支
11 git br -d <branch> # 删除某个分支
12 git br -D <branch> # 强制删除某个分支 (未被合并的分支被删除的时候需要强制)
    2、分支合并和rebase
git merge <branch> # 将branch分支合并到当前分支
git merge origin/master --no-ff # 不要Fast-Foward合并,这样可以生成merge提交
git rebase master <branch> # 将master rebase到branch,相当于: git co <branch> && git rebase master && git co master && git merge <branch>

  6、版本(tag)操作相关命令

1 查看版本:$ git tag
2 创建版本:$ git tag [name]
3 删除版本:$ git tag -d [name]
4 查看远程版本:$ git tag -r
5 创建远程版本(本地版本push到远程):$ git push origin [name]
6 删除远程版本:$ git push origin :refs/tags/[name]

  7、补丁管理

1 git diff > ../sync.patch # 生成补丁
2 git apply ../sync.patch # 打补丁
3 git apply --check ../sync.patch #测试补丁能否成功

  8、暂存管理

git stash # 暂存
git stash list # 列所有stash
git stash apply # 恢复暂存的内容
git stash drop # 删除暂存区

  9、Git远程分支管理

 1 git pull # 抓取远程仓库所有分支更新并合并到本地
 2 git pull --no-ff # 抓取远程仓库所有分支更新并合并到本地,不要快进合并
 3 git fetch origin # 抓取远程仓库更新
 4 git merge origin/master # 将远程主分支合并到本地当前分支
 5 git co --track origin/branch # 跟踪某个远程分支创建相应的本地分支
 6 git co -b <local_branch> origin/<remote_branch> # 基于远程分支创建本地分支,功能同上
 7 git push # push所有分支
 8 git push origin master # 将本地主分支推到远程主分支
 9 git push -u origin master # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)
10 git push origin <local_branch> # 创建远程分支, origin是远程仓库名
11 git push origin <local_branch>:<remote_branch> # 创建远程分支
12 git push origin :<remote_branch> #先删除本地分支(git br -d <branch>),然后再push删除远程分支

  10、Git远程仓库管理

    1、GitHub或者gitlab仓库
1 git remote -v # 查看远程服务器地址和仓库名称
2 git remote show origin # 查看远程服务器仓库状态
3 git remote add origin git@github:robbin/robbin_site.git # 添加远程仓库地址
4 git remote set-url origin git@github.com:robbin/robbin_site.git # 设置远程仓库地址(用于修改远程仓库地址) git remote rm <repository> # 删除远程仓库
    2、创建远程仓库
git clone --bare robbin_site robbin_site.git # 用带版本的项目创建纯版本仓库
scp -r my_project.git git@git.csdn.net:~ # 将纯仓库上传到服务器上
mkdir robbin_site.git && cd robbin_site.git && git --bare init # 在服务器创建纯仓库
git remote add origin git@github.com:robbin/robbin_site.git # 设置远程仓库地址
git push -u origin master # 客户端首次提交
git push -u origin develop # 首次将本地develop分支提交到远程develop分支,并且track
git remote set-head origin master # 设置远程仓库的HEAD指向master分支
    3、命令设置跟踪远程库和本地库
1 git branch --set-upstream master origin/master
2 git branch --set-upstream develop origin/develop

  11、子模块(submodule)相关操作命令

    1、添加子模块
##git submodule add [url] [path]
如:$ git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs
    2、初始化子模块
初始化子模块:$ git submodule init ----只在首次检出仓库时运行一次就行
    3、更新子模块
更新子模块:$ git submodule update ----每次更新或切换分支后都需要运行一下
    4、删除子模块
1)$ git rm --cached [path]
2) 编辑“.gitmodules”文件,将子模块的相关配置节点删除掉
3) 编辑“.git/config”文件,将子模块的相关配置节点删除掉
4) 手动删除子模块残留的目录

  12、忽略一些文件、文件夹不提交

  在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,如

target
bin
*.db

  13、解决合并分支冲突的问题

git checkout int 
git pull
git merge origin/master
git push

  提交完代码,将冲突的部分去掉

   三、将代码从一个版本库推送到另一个版本库

  在实际的开发中,有可能遇到需要将A仓库的某个branch的代码独立成为一个新的仓库B。我们需要的不仅仅是这个branch的最新提交的代码,而是需要它的整个提交历史。这种需求对于git来说非常简单,主要依靠git remote命令来实现。

  1、把当前代码提交到另一个远程git仓库

  假如仓库repo_a当前位于branch_a,要求将branch_a的整个数据(包括提交历史)全部提取出来,并建立一个新的仓库repo_b。这里假设仓库repo_b已经被建立。
  git remote add基本语法如下。name和url是必须的。

git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
    1、将仓库repo_b的URL添加到工作仓库的remote。
git remote add origin_repo_b git@server_ip:/path/repo_b.git

  (origin_repo_b:自己起的名字,只要不与现有的remote名重复即可)
  (git@server_ip:/path/repo_b.git:repo_b的远程路径)

    2、将代码推送到远程repo_b。
git push origin_repo_b branch_a

  (origin_repo_b:远程仓库repo_b的名字)
  (branch_a:仓库repo_a的的branch_a分支)

    3、克隆仓库repo_b,检查是否push成功。
git clone git@server_ip:/path/repo_b.git

  2、将一份相同的代码提交到多个不同的git托管服务器(多个git仓库)

  方法非常相似,多使用到了命令git remote set-url --add [--push] <name> <newurl>
  假设在远程的git服务器上又新增了一个仓库repo_c,现在要求repo_b、repo_c提交的代码必须一致。

    1、将远程repo_c配置到当前的工作的本地git仓库中
git remote set-url --add origin_repo_b git@192.168.1.101:~/project/repo_c.git

  这句话的意思是,将远程仓库git@192.168.1.101:~/project/repo_c.git也加入到origin_repo_b这个名字下面管理

    2、将代码同时提交到远程仓库repo_b和远程仓库repo_c
git push origin_repo_b branch_a
原文地址:https://www.cnblogs.com/happy-king/p/9253141.html