Git的基本操作

Git的基本操作

一、Git、谁与争锋

  1. git init:可以让Git完成管理前的准备工作
    • Git会在这个文件夹创建所谓的repositry(文档库),里面存储被管理的文件和文件内容,包括所有曾经被加入的历史版本
    • 文档库其实是叫做.git的子文件夹,默认它会被隐藏
  2. git help -a:显示完整的指令列表
    • git init -help:会显示该指令的网页说明文件
    • 如果指令太长,想要换到下一行继续输入,可以使用反斜杠\结尾,按下Enter键,继续输入
  3. git add:是准备把文件送进Git文档库,会把文件内容加入Git系统的索引
  4. git commit -m '这次的操作说明' --author='操作者姓名 <email 邮箱>'
  5. git commit --amend -m '新的的操作说明' --author='操作者姓名 <email 邮箱>'
  6. gitk:启动图形查看模式
  7. exit:退出Git Bush

二、Git配置文件的妙用

  1. git config -l:显示当前Git的设置
  2. git config --system -l:显示Git程序安装文件夹中的etc\gitcondig文件内的设置
  3. git config --global -l:显示登录账号的home directory中的.gitconfig文件内的设置
  4. git config (--global/--system) user.name '操作者姓名':把操作者的姓名指定在对应的配置文件中
  5. git config unset user.name:删除配置文件中的设置项
  6. git config --global core.editor notepad:修改默认的编辑器
  7. git diff:对比这两个版本之间的差异,在git add后执行
  8. git difftool配置文件对比程序
    • git config diff.tool kdiff3:为文件对比程序取名
    • git config difftool.kdiff3.path " 执行文件路径":配置执行文件的路径
    • git config difftool.prompt false:关闭提示功能,可不要

三、把文件存入Git文档库

  1. Git文件分类:
    • 被追踪的(tracked)
    • 忽略的(ignored)
    • 不被追踪的(untracked)
  2. 关于’.gitignore’的用法:
    • touch .gitignore
    • .gitignore文件库内设置忽略大的文件
    • .gitignore 123.txt
    • '#'注释 *.txt !表示排除
  3. 使用以下指令删除Git索引中特定文件的内容
    • git rm --cached 文件名:文档中还没有加入任何文件,git init之后,还没有执行过git commit
    • git reset HEAD 文件名:文档库中已经有文件,执行过git commit命令

四、比较文件的差异和从Git文档库中取回文件

  1. git mv 原来的文件名 新的文件名:会更改文件中的文件名,并记录在Git索引中只要执行git commit就可以更新文档库
  2. git checkout 文件1 文件2:从文档库中取出文件,文件夹中的文件会被取出的文件覆盖(避免这种情况,用git reset HEAD清除Git索引)
  3. 暂存文件的操作:
    • git stash save:暂存文件夹中的文件状态
    • git stash list:显示暂存文件
    • git stash pop/apply:取出暂存文件,并且合并到当前文件夹中的文件
  4. git gc:清理Git文档,以确保运行效率
    • '--aggressive':Git会用比较仔细的方式检查以及清理,但是需要比较旧的时间
    • '--auto':Git会先判断文档库是否需要清理。如果情况还算良好,就不会执行清理的操作
    • '--no-prune':Git不清楚文档库中不会用到的数据,只要整理它们即可

五、Git程序项目管理的实践演练

  1. git checkout HEAD .:从Git文档库中取出所有的文件
  2. 删除文件夹以及它的追踪状态
    • 从项目中删除不想要的文件夹
    • git add -A .:Git会检查文件夹中是否有文件夹被删除。这些被删除的文件会在Git索引中标记,当执行git commit指令的时候,被标记删除的文件也会从新的commit节点中删除

六、获取Git文档库统计数据

  1. git log:会按照时间顺序,从最近一次的commit节点开始,往前列出每一次commit的数据,包括标识符、执行人、日期和时间、以及说明
    • git log --author='A':筛选出A执行的commit
    • git log 文件1 文件2:只显示改过某些文件的commit
    • git log --after(since)=' ' --before(until)=' ':显示指定时间的commit
    • 如果加上'--stat\--numstat\shortstat'还可以显示每一个commit的变更情况
    • 如果加上’–oneline’,还可以用更精简的方式显示
  2. git shortlog:会按照名字的顺序排序,列出每一个人执行commit的次数和说明
    • 如果加上--numbered/-n,从高至低按序排列
    • 如果加上'--summary/-s',不需要显示commit说明
  3. git ls-files:会列出文档库中的文件列表
    • git ls-files | xargs wc -l:计算文件中的代码行数
    • git ls-files | xargs cat | wc -l:计算函数的总和

七、程序项目的分支(Branch)

  1. git branch:列出当前文档库中正在开发的所有分支

  2. git branch 自己取的分支名称 commit节点标识符或是标签:在Git文档库中创建分支

    • 如果最后指定了commit节点标识符或是标签,就会从该节点长出分支
    • 如果没有指定能够commit节点,就会从最新的commit长出分支
  3. git checkout 分支名称:切换当前操作的分支

    • git checkout -f 分支名称:当Git要覆盖文件夹中的文件时,会检查该文件的内容是否已经加入文档库,如果还没有加入,Git会显示警告信息,并且停止执行,以免资料遗失。如果确定不想保留这些已经修改,却还没有加入文档库的文件,用该命令,Git会强制覆盖修改后的文件
    • git checkout .:用文档库中的文件覆盖文件夹中的文件
  4. gitk -all:同时显示所有分支

  5. gitk log --graph --oneline --all --decorate

    • '--graph':画出commit节点的演进图
    • '--oneline':用最精简的方式显示
    • '--all':显示所有的分支
    • '--decorate':表示分支的名称
    • *表示commit节点
  6. git branch -d 要删除的分支名称:要删除分支,必须先切换到另一个分支

  7. git branch -D 要删除的分支名称:在一般情况下,分支应该合并到另一个分支。如果要删除的分支还没有合并,Git会显示错误信息,并且停止删除分支的操作。要删除还没有合并的分支,可以使用上述的命令

  8. git branch -m 新的分支名称:如果想要更改分支的名称,必须先切换到该分支

  9. git checkout HEAD^:detached HEAD状态,这时候HEAD指向倒数第二个commit节点,现在已经不属于任何一个分支

    • git checkout commit节点:让文件夹中的文件变成指定的commit节点的版本,会让当前分支的HEAD指向该commit节点,形成所谓的detached HEAD状态
    • git checkout commit节点 .:让文件夹中的文件变成指定的commit节点的版本,不会更改HEAD状态
    • 假设现在修改文件夹中的文件,并且使用git addgit commit指令将修改后的文件加入文档库。这时候,会从当前所在的节点,长出一个没有名称的分支。必须执行gitk log --graph --oneline --all --decorategitk -all图形查看模式不会显示这个无名的分支
  10. 处理无名分支

    • 法1:放弃这个无名分支的文件内容,就是直接删除这个无名分支
    • 法2:把这个无名分支的文件内容合并到原来的分支(3-way merge

    法1:

    /*1. 首先赋予这个无名分支一个名称*/
    git branch 无名分支的分支名称
    
    /*2. 切换到另一个分支*/
    git checkout master
    
    /*3. 在将这个无名分支删除*/
    git brach -D 无名分支的分支名称
    

    法2:

    git branch 无名分支的分支名称
    git checkout master
    git merge 无名分支的分支名称
    

八、合并程序项目的分支和解决冲突

  1. git merge 分支名称:会把指定的分支,合并到当前Git工作中的分支
  2. git banch -d 分支的名称:分支被合并之后,名称还是会继续存在,必须将被合并的分支删除
  3. git reset --hard HEAD^:刚刚执行合并分支的操作,现在要恢复合并前的状态
    • –hard表示文件夹中的文件也要一起恢复
    • 合并之后的HEAD节点会有两个父节点,可以分别使用'HEAD^1'和'HEAD^2'来指定,或是直接使用commit节点的标识符来指定
  4. 合并方式
    • fast-forward merge:这种合并是把分支的修改完全运用到master分支,就像是让master分支沿着另一分支’快进’。不会产生新的commit节点,不会留下合并的记录;如果希望留下合并的记录,可以在执行合并时使用git merge --no--ff 分支名称commit节点会自动产生)
    • 3-way merge:把master分支最新的commit节点的文件内容和另一分支最新的commit节点的文件内容合并,并产生一个新的commit节点
    • 执行git merge指令,Git会自动判断应该使用fast-forward merge或是3-way merge,除非加上'--no-ff'选项
    • 3-way merge的处理方式比fast-forward merge复杂。因为fast-forward merge的文件内容只会在一个分支中修改,另一个分支没有任何变动,所以保证一定可以合并成功;但是3-way merge的情况是两个分支都修改了文件内容,如果修改的是同一个文件中相同的地方,就会造成’冲突’的情况
  5. 解决冲突
    • git merge 分支名称:报有冲突产生
    • git status:检查现在状态
    • 打开有冲突的文件,然后加以修改。修正冲突的内容,然后删除冲突的标识,也就是<、=和>开头的那几行
    • git diff:修正所有冲突文件之后
    • git add .git commit -m "操作说明"git branch -d 分支名称
  6. 设置Merge Tool解决合并分支时发生的冲突
    git config --global merge.tool kdiff3
    
    git config --global mergetool.kdiff3.path " 程序的路径 "
    
    git config --global mergetool.prompt false//prompt设置项是设置Git在启动外部程序之前,是否要询问我们
    
    git config --global mergetool.kdiff3.trustExitCode false//trustExitCode 是设置外部程序结束之后,Git是否直接用它的返回值来判断是否成功
    
    git config --global mergetool.keepBackup false//keepBackup是设置决定是否要备份原来含有冲突标识的文件
    
    和并分支的方法:
    git checkout master
    git merge 被合并的分支名称
    git mergetool
    git commit -m "操作说明"
    git branch -d 被删除的分支名称
    
    • KDiff3程序会用自己的设置来决定是否要备份原来 含有冲突标识的文件,该设置项是在Settings->Configure KDiff3->Directory,其中有一个Backup files(.orig)的设置项,它就是用来设置是否要备份文件
  7. git cherry-pick commit节点标识符或标签:把某一个commit节点的文件版本,合并到文件夹中的文件。在默认情况下,执行这个指令会创建一个新的commit节点,如果不想要创建新节点,可以加上'-n'选项。执行这个命令前,必须把修改的文件存入文档库
    • 由于cherry-pick指令需要执行合并,因此也会发生文件冲突的情况
    • git status:查看冲突的详细信息
  8. 发生冲突时:
    • 法1:放弃执行,'git cherry-pick --abort'
    • 法2:修改文件冲突(1.手动修改冲突文件 2.git mergetool
    • 继续git add .
    • 继续git cherry-pick --continue
  9. git reset指令,可以讲过Git文档库恢复到某一个旧节点的状态。如果加上'--hard'选项,文件夹中的文件也会一起恢复
  10. git revert:也可以文件夹中的文件恢复到某一个commit节点的状态,不同的是,revert不会删除Git文档库中的commit节点。相反的,在修改文件夹中的文件之后,它会新增一个commit节点
    • git revert commit节点指令是回到指定的commit节点的前一个节点的文件状态
    • git reset --hard commit节点:回到指定的commit节点的文件状态
  11. git revert --abort:取消revert指令

九、使用Rebase指令更新分支的起始点

  1. rebase指令的功能是把另一个分支的修改运用到当前的分支,原来从commit节点x长出来的draft分支,会变成从master分支最新放入commit节点长出来。将主分支的修改,合并到开发中的分支
  2. Rebase指令的用法
    • git checkout 分支名称
    • git rebase master:把原来的master指令换成rebase指令
    • 如果有文件冲突(手动修改、git mergetool
    • git add .
    • git rebase --continue
  3. git rebase --abort:放弃这一次的rebase操作,可以在还没有完车rebase之前,执行该命令,Git文档库就会恢复到还没有执行rebase之前的状态
  4. 如果当前工作的分支是和其他人共享,(也就是Git文档库是在远程的服务器上),就不适合执行rebase指令,否则会造成和其他人的文档库出现数据不一致的问题。这种情况表下应该使用merge指令
  5. git reflog HEAD或是任何分支的名称:可以查询任何分支变动的历史记录
    • git reflog master:显示master变动的历史记录。可以使用'master@{数字}'来表示它所对应的commit节点
    • git reflog不带任何参数,就会列出HEAD变动的历史记录(git reset --hard HEAD@{数字}回到执行rebase之前)

源于整理《完全学会Git·GitHub·Git Server的24堂课》

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值