【Git】Git命令大全及实战应用

目录


1. git 实战

1.1. 多人协作

1.1.1. 多人协作中的 push & 冲突解决

  • 多人协作中版本推送到远程仓库的流程
    • 整理好本地仓库的版本:使用git add 和git commit生成一个新的版本;
    • 尝试直接将本地的更新推送到远程仓库。使用 git push。
    • 若 push 失败,则说明远程仓库的分支版本领先本地,即从上次pull或者fetch后,有人提交过更新。解决方案如下。
      1. 获取远程的最新版本与本地分支合并,使用git pull 或者git fetch + git merge。
      2. 合并时,若出现冲突,手动解决冲突后,使用git add 和git commit生成一个新的版本。
      3. 使用git push 将合并后的版本推送到远程仓库。

参考:git多人push

1.2. 回退

  1. 还原/恢复单个文件
    # 未git add
    git checkout -- aaa.html 			// 指定还原`aaa.html`文件
    git checkout -- * 				    // 还原所有文件
    
    # 已经add 未commit
    git reset HEAD               // 回退到当前版本
    git checkout -- aaa.html
    
    # 已经commit
    git reset HEAD^             // 回退到上一个版本, HEAD~数字 是回退到数字个版本
    git checkout -- aaa.html
    

参考:

  1. git 还原修改,放弃当前的修改

1.3. 冲突解决

git chrry pick 和 git rebase 之后, 存在冲突:

  1. 解决方法

    1. 手动解决所有冲突
    2. git add 添加修改的文件
    3. git rebase --continue
    4. git commit --amend 或 git commit -m ""
    5. git  push 
    
  2. 冲突类型

    1. 对于“both added”、“both deleted”、“both modified”等类型的冲突,若想完整地保留某一方的修改可以执行git checkout --ours(或者–theirs) <文件名>来选择想要保留的版本。
    2. 需要注意的是由于git rebase 是先撤销再应用commit,所以这里的ours指的是upstream-branch,theirs指的是我们将要应用的临时commit。
  3. git rebase 如何撤销:

    git rebase  过程中可以使用git --abort/--continue来进行操作;
    -- 成功之后如何撤销呢?
    git reflog查看本地记录
    git reset --hard 'rebase之前的第一个ID'
    

参考:

  1. git rebase 的常见冲突及解决办法

1.4. 版本差异比较

1.4.1. 远程与本地 差异比较

1.4.2. 文件差异比较


2. Git

2.1. 概述

分布式 版本管理工具;

2.1.1. git、bash、shell区别

  • git
    版本控制工具,支持该工具的网站有Github、BitBucket、Gitorious、国内的osChina仓库、csdn仓库等等。

  • shell
    是linux、unix系统的外壳,也可以理解为命令行,就是你输入并执行命令的地方,git通过命令行和图形界面两种方式使用shell。

  • bash
    是shell的一种,最常用的shell之一。

  • git Bash
    方便你在windows下使用git命令的模拟终端(windows自带的cmd功能太弱)linux、unix可以直接使用git。

  • git shell
    它是安装了git的shell,bash是一种shell。

2.1.2. 界面化管理工具:

  • GitHub for Desktop

  • Source Tree

  • TortoiseGit
    SVN 有关;

参考:

  1. git、bash、shell 区别

2.2. 参考资料

  1. git Reference
  2. Windows下Git的使用       //命令实施解析 牛皮
  3. Git实用 视频教程 小甲鱼    //极客首选之Python
  4. Git 教程         //菜鸟教程
  5. 常用 Git 命令清单     //更全面,熟练使用必备;
  6. git 项目管理常用操作流程    //git 操作流程

2.3. git辅助工具

  1. TortoiseGit 小乌龟
    参考:
    1. TortoiseGit使用教程

3. Git基础

3.1. 基础知识

  1. 模式种类
    a) 界面模式 仅包含常用命令
    b) 命令行模式 包含所有命令 要掌握
  2. Git介绍
    a) Git每个版本独立保存;
  • 词汇
    fetch    拿来;
    checkout 结账;
    rebase   重订基准;       --pull
    

3.1.1. Git常用命令

常用命令:

avatar

3.1.2. Git结构

 ### 3课树的结构;
 Workspace       工作区(电脑里看到的目录)
 Index / Stage   暂存区(.git目录,.git/index)
 Repository      仓库区(或本地仓库  git版本库)
 Remote          远程仓库  

主要结构及操作:

avatar

3.2. 配置 --global

 .gitconfig 分为项目配置和全局配置;

# 显示当前的Git配置
  git config --list

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

# 设置提交代码时的用户信息
  git config [--global] user.name "[name]"
  git config [--global] user.email "[email address]"
# 查看 所有用户配置
  git config --list
  ## 编辑信息
    vim ~/.gitconfig

3.3. 新增 & 添加

当前目录下的版本控制;

# 在 当前目录新建一个Git代码库
  git init
# 新建一个目录,将其初始化为Git代码库
  git init [project-name]

# 下载一个项目和它的整个代码历史       ## 下载项目;
  git clone [url]
## 注:从GitHub下载项目,的确很慢;

3.3.1. clone 详解:

#从现有Git仓库中拷贝项目
git clone <repo> 

# 克隆项目的指定分支  git clone 指定分支
git clone -b <分支名> <repo>

#克隆到 指定的目录  
git clone <repo> <directory>  

### 不同协议  
git clone git@github.com:fsliurujie/test.git         --SSH协议   #速度较快;
git clone git://github.com/fsliurujie/test.git          --GIT协议
git clone https://github.com/fsliurujie/test.git      --HTTPS协议

## 等价的git clone写法:
git clone http://github.com/CosmosHua/locate new
git clone http://github.com/CosmosHua/locate.git new
git clone git://github.com/CosmosHua/locate new
git clone git://github.com/CosmosHua/locate.git new

3.3.2. 增加/删除文件

git add              //添加到暂存区域
git add *             //添加 目录下的全部文件
3.3.2.1. 增加及删除
  • 增加、删除 文件|目录
    # 添加指定文件到暂存区
      git add [file1] [file2] ...
    
    # 添加指定目录到暂存区,包括子目录
      git add [dir]
    
    # 添加当前目录的 所有文件到暂存区
      git add .
    
    # 添加每个变化前,都会要求确认
    # 对于同一个文件的多处变化,可以实现分次提交
      git add -p
    
    # 删除工作区文件,并且将这次删除放入暂存区
        git rm [file1] [file2] ...
    # 停止追踪指定文件,但该文件会保留在工作区
        git rm --cached [file]
    # 改名文件,并且将这个改名放入暂存区
        git mv [file-original] [file-renamed] 
    
3.3.2.2. 删除详解
删除也是一种修改,删除的方式有2种:
1. rm  相当于在资源管理器里面直接删除,只删除工作区的文件,可以直接使用checkout还原;  
2. git rm  则是删除工作区和暂存区的文件,需要先使用reset,再使用checkout还原(只用这个会报错);

3. 彻底删除文件,则git rm git后需要git commit。
3.3.2.3. git clear

删除一些没有 Git add 的 文件;

  • 参数
    git clean 参数
        -n 显示 将要 删除的 文件 和  目录
        -f 删除 文件,-df 删除 文件 和 目录
    ## 实际使用
      git clean -n
      git clean -df      目录等 强制删除;
      git clean -f "指定文件"    --删除指定文件;
    

3.4. 代码提交

3.4.1. git commit

# 提交暂存区到 仓库区
    git commit -m [message]
# 提交暂存区的指定文件到仓库区
    git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区
    git commit -a
# 提交时显示所有diff信息
    git commit -v

# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
    git commit --amend -m [message]

# 重做上一次commit,并包括指定文件的新变化
    git commit --amend [file1] [file2] ...

3.4.2. 信息修改

# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
   git commit --amend -m [message]
# 更改 前n次的commit -m " 信息 "
   git rebase -i HEAD~n

3.5. 回滚

3.5.1. 查看状态/信息

git status 
git log                 //查看记录 commit记录
git reset               //返回之前  

git push -f             //强行回退远程代码  回滚本地后, 强推;
  • 查看 ID 信息

    # 获取完整commit id
    #(如:14123c8877e6ebdc220e205d92fc70feaf06dab1)
      git rev-parse HEAD
    
    # 获取short commit id(如:14123c8)    -- 前7位;
      git rev-parse --short HEAD
    
  • git log、git show 等

    # 显示有变更的文件
      git status  
    # 简短结果 显示有变更的文件;
      git status -s
    
    # 显示当前分支的版本历史
      git log 
    # 显示commit历史,以及每次commit发生变更的文件
      git log --stat
    # 搜索提交历史,根据关键词
      git log -S [keyword]
    # 显示某个commit之后的所有变动,每个commit占据一行
      git log [tag] HEAD --pretty=format:%s
    # 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
      git log [tag] HEAD --grep feature
    # 显示某个文件的版本历史,包括文件改名
      git log --follow [file]
      git whatchanged [file]
    
    # 查看某个文件的提交历史
      git log filename
        ## filename 需要是当前目录下的文件 或 指定文件路径
    
    # 显示指定文件相关的每一次diff
      git log -p [file]
    # 显示过去5次提交
      git log -5 --pretty --oneline
    # 显示所有提交过的用户,按提交次数排序
      git shortlog -sn
    
    # 显示指定文件是什么人在什么时间修改过
      git blame [file]
    
    # 显示暂存区和工作区的差异
      git diff
    # 显示暂存区和上一个commit的差异
      git diff --cached [file]
    # 显示工作区与当前分支最新commit之间的差异
      git diff HEAD
    # 显示两次提交之间的差异
      git diff [first-branch]...[second-branch]
    # 显示今天你写了多少行代码
      git diff --shortstat "@{0 day ago}"
    
    #===== git show =========
    # 显示某次提交的元数据和内容变化
      git show [commitID]
    # 查看提交所更改的文件
      git show commitId --stat
    # 显示某次提交发生变化的文件
      git show --name-only [commit]
    # 显示某次提交时,某个文件的内容
      git show [commit]:[filename]
    # 查看某次commit中具体某个文件的修改  --查看文件的更改
      git show commitId fileName
    # 显示当前分支的最近几次提交
      git reflog
    

3.5.2. 回滚/撤销

  • 返回

    git reset  --mixed HEAD~     返回上一个
    git reset  --soft head~       软返回
    git reset  --hard head~    
    
  • HEAD 详解

    HEAD 表示当前版本
    HEAD^  上一次版本
    HEAD^  上上版本
    HEAD~2  上上版本   #使用数字;  ~ + 数字;
    
  • 回滚 / 撤销

    # 恢复 暂存区的指定文件到工作区
    ## 注意:会清除工作区中从未添加到暂存区的改动;
        git checkout [file]
    # 恢复某个commit的指定文件到暂存区和工作区
        git checkout [commit] [file]
        git checkout HEAD^ --file   # file文件回退到HEAD^版本
      ##会 清除工作区和暂存区 未提交到master的更改;  需谨慎;
        git checkout HEAD .git checkout HEAD <file>
    
    
    
    # 恢复暂存区的所有文件到工作区
        git checkout .gi
    
    # 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
        git reset [file]
    # 重置暂存区与工作区,与上一次commit保持一致
        git reset --hard
    # 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
        git reset [commit]
    # 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
        git reset --hard [commit]
    # 重置当前HEAD为指定commit,但保持暂存区和工作区不变
        git reset --keep [commit]
    
    # 新建一个commit,用来撤销指定commit
    # 后者的所有变化都将被前者抵消,并且应用到当前分支
      git revert [commit]
    
    # 暂时将未提交的变化移除,稍后再移入
      git stash
      git stash pop
      git stash list
      git stash apply listnum
      git stash save "保存的描述信息"
      git stash show -p stash{num}  查看stash{num}的更改内容
    

3.5.3. 回滚的类型

1. 个别文件
  git reset 版本快照 文件名/文件路径
2. 快照
  git reset 版本快照的版本号

3.5.4. 提交 与 修改

  1. 提交之后,又需要修改

3.6. 版本对比

git diff    比较文件的不同,字符的比较;

3.6.1. 比较的类型

  1. 快照的比较
    git diff 快照ID
  2. 比较暂存区、库中的内容:
    git diff –cached

3.7. 远程仓库

3.7.1. 远程同步 – git pull & git push git remote

与服务器、GitHub等远程连接;

  • 常用命令

    # 新建分支并切换到指定分支
      git checkout -b 本地分支名 origin/远程分支名
    # 下载远程仓库的所有变动
      git fetch [remote]
    
    # 显示所有远程仓库
      git remote -r
    # 查看本地分支及追踪的分支
      git branch -vv
    
    # 显示某个远程仓库的信息
      git remote show [remote]
    # 增加一个新的远程仓库,并命名
      git remote add [shortname] [url]
    
    # 取回远程仓库的变化,并与本地分支合并
      git pull [remote] [branch]
    
    == git push ==
    # 将本地分支推送到远程
        git push <远程主机名> <本地分支名>:<远程分支名>
          git push -u origin dev:release/caigou_v1.0
    # 上传本地指定分支到远程仓库
        git push [remote] [branch]
    # 强行推送当前分支到远程仓库,即使有冲突
        git push [remote] --force
    # 推送所有分支到远程仓库
        git push [remote] --all
    
  • 强行覆盖本地更改

    # git强制覆盖本地命令(单条执行):
      git fetch --all 
      git reset --hard origin/master
      git pull
    ?
    第一个是:拉取所有更新,不同步;
    第二个是:本地代码同步线上最新版本(会覆盖本地所有与远程仓库上同名的文件);
    第三个是:再更新一次(其实也可以不用,第二步命令做过了其实);
    
3.7.1.1. 其他
  • 服务器、GitHub连接
    在主机上建立一个 git 账户,让每个需要写权限的人发送一个 SSH 公钥, 然后将其加入 git 账户的 ~/.ssh/authorized_keys 文件。 这样一来,所有人都将通过 git 账户访问主机。

    # 连接服务器
        git clone git@'服务器地址':/home/git/test/tmp.git;
    
    # 连接 GitHub   
    
    

3.7.2. git pull 与 git pull --rebase

  • 区别
    # 区别
        git pull = git fetch + git merge
        git pull --rebase = git fetch + git rebase
    # 具体分析:
        ## git rebase
            能够减少菱形冲突;
        1. 在rebase的过程中,有时也会有conflict,这时Git会停止rebase并让用户去解决冲突;
          解决完冲突后,用git add命令去更新这些内容,然后不用执行git-commit,直接执行git rebase --continue,
            这样git会继续apply余下的补丁。
        2. 在任何时候,都可以用git rebase --abort参数来终止rebase的行动,并且mywork分支会回到rebase开始前的状态。
    
    
    20200519104225
    git rebase 将E提交废除;
    20200519113636

3.8. 文件删除、重命名

3.8.1. 删除文件

git rm 文件名
git rm -f  文件名            //强力删除文件
git 

3.8.2. 修改文件名

git mv     文件名   新文件名   
git mv/ren  文件名   新文件名    //ren  windows的命令

4. Git进阶

4.1. 分支管理    //重要

备注:

  • master 主分支
  • HEAD 指向 有提示;

4.1.1. 分支命令

# 列出所有本地分支
  git branch
# 列出所有远程分支
  git branch -r
# 列出所有本地分支和远程分支
  git branch -a

# 新建一个分支,但依然停留在当前分支
  git branch [branch-name]
# 新建一个分支,并切换到该分支
  git checkout -b [branch]
# 新建一个分支,指向指定commit
  git branch [branch] [commit]
# 新建一个分支,与 指定的远程分支建立追踪关系
  git branch --track [branch] [remote-branch]

# 切换到指定分支,并更新工作区
  git checkout [branch-name]
# 切换到上一个分支
  git checkout -

# 建立追踪关系,在现有分支与指定的远程分支之间
  git branch --set-upstream [branch] [remote-branch]
# 合并指定分支到当前分支
  git merge [branch]
# 选择一个commit,合并进当前分支
  git cherry-pick [commit]

# 删除分支
  git branch -d [branch-name]
# 删除远程分支
  git push origin --delete [branch-name]
  git branch -dr [remote/branch]

4.1.2. 切换分支

1)	git checkout  分支名;      HEAD指向一个分支,使用命令进行切换;
2)	git log --decorate --oneline --graph –all       精简显示文件的log

4.1.3. 合并、删除分支

##  分支管理
git merge ***         合并分支名
git branch -d  ***    删除分支

git branch -d 会在删除前检查merge状态(其与上游分支或者与head)。
git branch -D 是git branch --delete --force的简写,它会直接删除。

checkout  reset     区别
reset               将指定文件只覆盖到暂存区域;

4.2. 标签管理

  • 标签的作用

  • 常用命令:

    # 列出所有tag
      git tag
    # 新建一个tag在当前commit
      git tag [tag]
    # 新建一个tag在指定commit
      git tag [tag] [commit]
    # 删除本地tag
      git tag -d [tag]
    # 删除远程tag
      git push origin :refs/tags/[tagName]
    
    # 查看tag信息
      git show [tag]
    # 提交指定tag
      git push [remote] [tag]
    # 提交所有tag
      git push [remote] --tags
    
    # 新建一个分支,指向某个tag
      git checkout -b [branch] [tag]
    

4.3. 使用GitHub

4.4. 使用码云

 使用码云克隆github上的项目,速度较快;

4.5. 自定义Git

4.6. 其他

# 生成一个可供发布的压缩包
  git archive

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值