Git基本命令

200 阅读11分钟

分布式版本控制工具

  • 集中式:版本库集中存放在中央服务器(自己电脑没有,每次必须联网拉取),必须联网才能工作;CVS是目前用的最多的开源且免费的集中式版本控制系统;

  • 分布式:每台电脑都是一个完整的版本库。

本地版本库

创建版本库(仓库)

mkdir myCode
cd myCode
pwd    //显示当前目录
git init    //创建版本库
ls -ah    //可以看到隐藏的.git目录,用于跟踪管理版本库

//将文件添加到仓库
git add readme.txt
//将文件提交到仓库,-m后面输入本次提交的说明
git commit -m "wrote a readme file"
//查看结果
git status
//查看修改的内容
git diff readme.txt

版本回退

回退的时候git仅仅是移动HEAD指针的位置,所以操作非常快。

//查看提交日志
git log
git log --pretty=oneline    //简介版
//查看命令历史
git reflog
//回退
git reset --hard HEAD^ //回退到上一个版本
git reset --hard HEAD^^ //回退到上上个版本
git reset --hard HEAD~8    //回退到往上第八个版本
git reset --hard commit_id    //回退到id版本

工作区和暂存区

  • 工作区:在电脑里能看到的目录;

  • 版本库:工作区的隐藏目录.git;版本库包含stage(index)暂存区和分支、指针HEAD;

    git add:把文件添加到暂存区

    git commit :把暂存区内容添加到版本库

    //丢弃readme工作区的修改
    git checkout -- readme.txt
    //把暂存区内容回退到工作区
    git reset HEAD readme.txt
    

删除文件

git rm test.txt    //从版本库中删除该文件

远程仓库

//添加远程库
git remote add origin "仓库地址"    //origin是指定的远程仓库名
//推送到远程
git push -u origin master    //-u可以关联本地master和远程master,后期可以直接git push,git pull
//查看远程仓库
git remote -v
//删除远程库origin(解除和远程库的绑定关系)
git remote rm origin
//克隆仓库
git clone "仓库地址"

分支管理

创建与合并分支

//创建并切换到分支dev
git checkout -b dev
//相当于
git branch dev    //创建分支
git checkout dev    //切换分支

//查看当前分支
git branch


//合并分支,先切换到目标分支
git checkout master
git merge dev


//删除分支
git branch -d dev
//分支未合并,强行删除,用大写的D
git branch -D dev


//切换分支时也可以使用switch
git switch dev    //切换到已有分支
git switch -c dev  //创建并切换到新的dev

解决冲突

//查看冲突文件
git status
//查看分支合并情况
git log --graph --pretty=oneline --abbrev-commit

分支管理策略

  • master:仅用于发布新版本

  • dev:用于开发

  • feature:用于新功能开发

  • issue:修复BUG

//--no-ff 禁用Fast forwar
git merge --no-ff -m "message" dev
//抓取远程分支dev并切换到该分支
git checkout -b dev origin/dev
//关联本地分支与远程分支
git branch --set-upstream-to=origin/dev dev
git branch --set-upstream dev origin/dev
//推送远程
git push origin dev
//抓取远程
git pull origin dev

复制一个特定的提交到当前分支

git cherry-pick commit-id

暂存

//暂存
git stash
//查看暂存栈
git stash list
//恢复但不删除栈顶的暂存
git stash apply
//删除栈顶的暂存
git stash drop
//恢复并删除栈顶到暂存
git stash pop

Rebase 变基:将提交到某一分支上的所有修改移动到另一分支

当前分支dev,rebase master会先将dev上与master共同的祖先节点之后的节点先撤销掉,放到缓存里面,HEAD指向master分支,再将缓存的提交一个个新增到master分支后面,中间可能需要处理多次冲突。


标签管理

//查看所有标签
git tag
//打标签1.0.00,默认标签搭载最新的commit上
git tag v1.0.00
//在某个commit上打标签
git tag v1.0.01 commit_id
//查看标签信息
git show v1.0.01
//创建带有说明的标签,-a指定标签名,-m指定说明文字
git tag -a v1.0.02 -m "version 1.0.02 released" commit_id
//删除本地标签
git tag -d v1.0.02
//删除远程标签
git tag push :refs/tags/v1.0.02
//推送标签到远程
git push origin v1.0.01
//一次性推送全部标签到远程
git push origin --tags

标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。




  1. GIT

撤销文件的修改

  1. 工作区的修改(还未add)

    $ git checkout -- 文件名        //回到最近一次的add或commit
    $ git checkout .    //撤销所有文件的修改
    
  2. 暂存区的修改(已经add但从未commit过)

    git rm --cached 文件名        //放弃该文件的暂存,需要修改后再次add
    
  3. 暂存区修改(已经add之前也有commit记录)

    git reset HEAD file    //让该文件回到工作区的状态
    git chekcout -- file  //git chekcout -- file
    
  4. 撤销仓库的提交注意要先备份

    git log commit_id1 (要回退的) commit_id2 (要回退的) commit_id3 (要回退的) commit_id4 (目标版本)

    假设要回退掉commit_id1,则commit_id需要指定为commit_id2

    /**
    * soft:保留工作区和缓存区,版本差异存放在缓存区,用于合并多个commit
    * mixed(默认):保留工作区,清空缓存区,版本差异存放在工作区,用于修改错误commit 或者git reset HEAD后清空缓存区
    * hard:慎用!!!,清空暂存区和工作区,放弃目标本后的所有修改
    **/
    //把commit_id1的修改恢复到暂存区,版本库保留提交记录
    git reset --soft commit_id2
    //把commit_id的修改恢复到工作区,版本库保留提交记录
    git reset --mixed commit_id2
    git reset --soft|mixed|hard cedc856    //本地使用 get reset --hard ,切换到特定的commit,该commit是要撤销的前一个commit,即要保留的commit
    git push --force origin master        //使用 --force推送到远程分支
    
  5. 回退到某个版本

    git reset ID file        //回退
    git commit file        //提交历史版本
    git checkout file        //把工作区给回退了
    
  6. 撤销某个提交的修改

    git revert commit_id
    //解决冲突后提交修改即可 
    

修改commit信息

  1. 刚刚commit未push == 刚刚commit且已经push,输入命令即可进入vi界面,修改完成后wq保存退出,即修改本地暂存区提交。如果已经提交远程,需要push提交修改。

    git commit --amend
    git push origin 分支    //已经push需要再次提交修改
    
  2. 修改历史记录,合并commit节点

    git rebase -i HEAD~n    //n为记录数,将会显示n个记录
    //将要修改的记录的pick修改为edit,wq保存退出,当前指针将会指向要修改的命令。接下来的操作同情况一
    git commit --amend    
    git push origin 分支        //-f 强制提交
    

    pick:保留该commit(缩写:p)

    reword:保留该commit,但我需要修改该commit的注释(缩写:r)

    edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)

    squash:将该commit和前一个commit合并(缩写:s)

    fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)

    exec:执行shell命令(缩写:x)

    drop:我要丢弃该commit(缩写:d)

检出节点:将A分支的某个commit提取到B分支

git checkout A
git log         //找到要提取到commit记录的哈希码ID
git checkout B
git cherry-pick ID    //此时可能有冲突,合并冲突后提交就行了

标签TAG

  1. 查看标签

    git tag
    
  2. 创建标签

    git tag 标签名 
    
  3. 推送标签到远程,如果此时有要推送到远程的东西,先comiit,推送标签时会把内容同时推送

    git push origin 标签名 
    
  4. 删除本地标签

    git tag -d 标签名 
    
  5. 删除远程标签

    git push origin :refs/tags/标签名  
    

暂存STASH

  1. 暂存

    git stash [save message]
    
  2. 查看暂存列表

    git stash list
    
  3. 恢复(只能一次,恢复同时删除记录)

    git stash pop [stash@{num}]        //不指定num,恢复最近暂存的记录
    
  4. 恢复(可多次,恢复不删除记录)

    git stash apply [stash@{num}]        //同上
    
  5. 删除某个记录

    git stash drop [stash@{num}]
    
  6. 删除所有的记录

    git stash clear
    

将master当前commit提交到另一个分支mmc

git push origin master:mmc    //先在master上commit

分支管理

git branch    //查看本地分支
git branch -r    //查看远程分支
git branch checkout master    //切换到master分支
git branch -d dev    //删除dev分支
git branch -D dev    //强制删除dev分支,-d不管用则使用-D
git push origin --delete dev    //删除远程分支(不要想不开啊)
git checkout -b dev    //创建并切换分支
  1. 拉取远程分支并创建本地分支

    //方法一:
    git checkout -b dev origin/dev    //创建本地分支并自动切换,然后关联远程分支
    //方法二:
    git fetch origin dev:dev    //拉取远程dev到本地dev,如果本地没有dev会自动创建
    

将dev的某一个文件同步到master

git checkout master
git checkout --patch dev path    //path是文件所在的路径,该路径是当前命令行地址的相对路径

fetch和pull的区别

fetch=pull+merge

git fetch origin master        //拉取远程分支到本地
git log -p master..origin/master    //比较拉取到远程分支和本地
git merge origin/master    //将拉取的远程分支合并到本地
git fetch origin master:master    //将远程master拉取到本地master
git diff master    //比较master差异
git merge master    //合并master
git pull origin master    //一句抵三句,终极boss

git add . + git commit -m "" == git commit -am ""

修改删除本地commit节点

1. git log     //查看提交信息
2. git rebase -i commitId //commitId是不需要合并的commit点hash值,即需要合并的commit的前一个commit
3. 进入编辑界面,pick即一动不动,squash是保留commit信息将自己合并到上一个commit点,fixup同squash但不保留commit信息编辑完成保存退出,drop删除commit点

回退

  • 整个本地仓库回退
git reset --hard HEAD^
git reset --hard commit_id
//上一个版本就是`HEAD^`,上上一个版本就是`HEAD^^`,当然往上100个版本写100个`^`比较容易数不过来,所以写成`HEAD~100`

回滚到某个版本并备份: 1.git fetch origin dev:newBranch先备份分支,切换到新的分支上操作 2.在Git面板中找到要回滚的提交记录,右键选中copy revision number复制版本ID,git reset --hard ID,强制回退到指定版本 3.git push origin newBranch 将本地分支推到远程

  • 本地某个文件回退

    git log fileName    #查看要回退的版本ID
    git checkout ID fileName #直接就回退了
    
  • 远程某个文件回退:

    git reset version_code file_name
    git commit -m 回退信息        //这时才可以在commit看到修改内容
    git checkout file_name    //回退到工作区
    git push origin     //提交到远程
    

查看

git status    //工作区
git log    //提交记录
git log --pretty=oneline
git reflog    //查看命令历史
git diff HEAD -- filename //查看工作区和版本库里最新版本的区别

概念

工作区 暂存区: git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit`就可以一次性把暂存区的所有修改提交到分支。

删除文件: 先删除工作区文件,再删除版本库文件,提交 rm filename git rm filename git commit -m "注释"

git reset

前情提要:在某次乱七八糟的提交push后,丢失了一个从未push的文件

git reflog    //查看命令历史
git rebase --hard reflog_id //hard可以回退工作区内容,soft和mixed不可以,备份文件后再rebase到之前到节点

--hard:重置工作区和暂存区 --soft:重置暂存区,保留工作区 --mixed(默认):清空暂存区,保留工作区

远程库相关

关联本地到远程仓库

git init    //初始化本地仓库
git remote add origin url    //关联到远程仓库,https格式的url首次推送时需要输入账号密码,github已不再维护。s sh格式的url需要将本机的ssh公钥保存到github账户中才可以进行推送。
git remote -v //    查看远端仓库地址
git remote rm origin //删除远端仓库地址

github 添加 ssh 公钥

#创建 ssh
cd ~/.ssh
ssh-keygen    #生成密钥,中间有两次需要输入口令,直接回车跳过,避免后期在使用密钥时就输入口令
ls     #查看目录
cat id_ira.pub    #查看公钥,将其复制到 github->settings->ssh and gpy keys->new ssh key,确定即可

删除文件

git rm -r --cache file_name    #文件夹加上--cache参数,递归删除子文件
git commit -am “删除文件”
git push origin master

马甲包复制仓库

//1. 复制本地文件夹,-r参数表示递归复制,针对复制文件夹
cp -r KKBooster KKLite
//2、进入KKLite
cd KKLite
//3、删除远程库origin
git remote rm origin
//4、创建孤立分支用于重置历史记录
git checkout --orphan new-branch
//5、将当前文件添加到新分支
git add -A 
git commit -am "init"
//6、使用-D删除所有的旧分支
git branch -D master
//7、将孤立分支重新命名为master
git branch -m master
//8、删除所有标签
git tag -l | xargs git tag -d
//9、添加新的远程库
git remote add origin "ssh/link"
//10、推送到远程
git push origin master

已经创建工程后如何设置仓库

//先初始化
git init
//添加仓库
git remote add origin "仓库链接"
git add .
git commit -am "init"
git push origin master