git基本语法与使用

看git官方教学视频记的笔记。归纳了一些常用命令的解释与使用案例。

commit


  • 在项目文件夹中打开git bash
可以查看git仓库代码的更新状态,有文件修改或者添加文件,文件会标红,修改add提交后变成绿色,文件提交到暂存区域。
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        new.txt

nothing added to commit but untracked files present (use "git add" to track)

$ git add new.txt
$ git commit -m "Just a test" //-m设置提交消息,每次提交都必须有提交消息

可以直接在github的项目代码中进行简单的编辑并设置commit信息。

Diff


  • 找出项目中哪些地方被改动了
$ git diff
  • 查看暂存区域文件和最近提交的历史文件有什么不同
$ git diff --staged
  • 将你的工作树和head commit相比较,即提交历史中的最新提交。
$ git diff HEAD
  • 上述diff命令显示修改的整行,以下可以更加详细地标明修改的字母或单词。
$ git diff --color-words

$ git diff --word-diff
  • 仅显示更改了的文件,不显示文件的内容。
git diff --stat

Log


  • 查看历史提交
$ git log 
commit fd40c22127be397f864e77aa0ced9ab101bb6201 (HEAD -> master, origin/master)
Author: susu_xi <xxx@163.com>
Date:   Thu Aug 23 16:06:50 2018 +0800

    改下文件名

commit fdd512fbe7943535f88c519d4c8192350b655720
Author: susu_xi <xxx@163.com>
Date:   Thu Aug 23 15:51:41 2018 +0800

    done

  • 查看所有历史提交信息概要
$ git log --oneline
fd40c22 (HEAD -> master, origin/master) 改下文件名
fdd512f done

  • 查看日志信息与每次提交包含的文件及其增删
$ git log --stat
commit fd40c22127be397f864e77aa0ced9ab101bb6201 (HEAD -> master, origin/master)
Author: susu_xi <xxx@163.com>
Date:   Thu Aug 23 16:06:50 2018 +0800

    改下文件名

 ip monitor/.classpath                           | Bin 0 -> 232 bytes
 ip monitor/.gitignore                           |   1 +
 ip monitor/.project                             | Bin 0 -> 386 bytes
 ip monitor/.settings/org.eclipse.jdt.core.prefs | Bin 0 -> 598 bytes
 ip monitor/src/ipWatching/Main.java             |  59 ++++++++++++++++++++++++
 ip monitor/src/ipWatching/packet.java           |  56 ++++++++++++++++++++++
 6 files changed, 116 insertions(+)

commit fdd512fbe7943535f88c519d4c8192350b655720
Author: susu_xi <xxx@163.com>
Date:   Thu Aug 23 15:51:41 2018 +0800

    done

 "\346\272\220\347\240\201/.classpath"              | Bin 0 -> 232 bytes
 "\346\272\220\347\240\201/.gitignore"              |   1 +
 "\346\272\220\347\240\201/.project"                | Bin 0 -> 386 bytes

  • 显示出具体版本间的不同,如果文件增加了内容会有绿色加号,减少了会有红色减号
$ git log --patch
  • 展示每次提交的一行概括,将会使用ASCII码描述全部提交,同时他会提供我们每个分支的标签和我们提交的其他的标志,例如tags(–decorate查看各个分支当前所指的对象)
$ git log --graph --all --decorate --oneline

remove


  • 从文件系统中删除文件,并且它会暂存这个文件已经被删除的事实,提交后,该文件的删除记录依然会存在log中。文件被直接删除后依然可以使用这个命令暂存文件删除记录。
$ git rm new.txt
rm 'new.txt'
....
  • 暂存当前工作目录下的所有文件的删除
$ git add -u . 
  • 删除提交历史,不删除文件
$ git rm --cached new.txt

move


$ git mv oldpath newpath
或者
$ mv oldpath newpath
$ git rm oldpath
$ git add newpath
  • 如果不想为每个文件移动都提交记录,那么可以在移动后使用以下命令。git自动判断已经发生的文件移动。无论移动的文件是否被修改,git都将它当作移动。
$ git add -A .
  • 查看指定文件的全部提交(不包括移动操作)
$ git log --stat -- 文件名
  • 查看指定文件的全部提交,包括移动过程
$ git log --stat -M --follow -- 文件名

移动操作提交中有数值记录移动前后文件的相似度,如果相似度大于50%,则git只将其当作一次移动,反之,会将其当作增加与删除。在-M后添加数字参数可以调节这一阈值

ignore


  为了避免文件或者目录提交到目标仓库,只需要在你的工程的根目录下面创建一个 .gitignore 文件
  github项目也可以直接添加.gitingore文件

$ touch .gitignore
$ git add .gitignore
$ git commit -m ” Preparing to ignore temporary files ”
$ vim .gitignore
  • 编辑gitingnore文件
new.txt
*.log
#使用#进行注释
test/ //忽略整个文件夹
  • 不需要查看.gitignore就可以查看忽略的文件
$ git ls-files --others --ignored --exclude-standard

branch


添加新特性,修复bug,又不想影响到原来的版本,就可以创建一个新的分支。

  • 创建新的分支(也可以使用checkout)
$ git branch 新分支名
  • 删除分支
$ git branch -d 分支名
如果分支没有合并,则-d需携程-D
$ git branch -D 分支名
  • 查看所有分支,分支名称左边有 * 号的是当前分支
$ git branch

或者使用git status也可以查看当前分支。

checkout


  • 切换分支,使HEAD指向新的分支。
    即切换当前工作的分支。所有的提交操作在当前工作分支上进行。
$ git checkout  分支名
  • 使head指向历史commit版本,进入detached head状态,并可以在该commit上建立新的分支。
$ git checkout commit_id
  • 清理掉最后一次commit的内容。
$ git checkout -- 文件名
  • 创建新的分支并切换到新分支。
$ git checkout -b new_branch_name

merge


  • 合并分支
$ git merge 分支名
  • 实例
一般使用master
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

确认该分支有我们想要合并的commit
$ git branch 
  debugging
 *master
 
合并想要合并的commit
$ git merge debugging
Updating 04c9e0b..4525389
Fast-forward 
 d2.rb | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
 此时master包含两者的综合,包括文件、修改和历史

合并的过程中两个文件的变化十分相似,git不知道如何去解决这些冲突,就是报出冲突信息,并指出冲突文件,待用户解决冲突后再重新提交。
(git status 也可以查看发生冲突的文件)

  • 解决冲突

    • 打开冲突文件,找到<<<<<<< HEAD。这里指出的是master分支上的文件内容。
    • 找到=======。这里指出master分支的文件内容分割。该标记以下为产生冲突的分支内容 。
    • 再之后的>>>>>>表示冲突结束的位置。
    • 删除以上标记,选择冲突内容中你想要留下的部分,删除另一个。
    • 保存文件
    • 暂存修改。git add 冲突文件
    • 提交修改。git commit 冲突文件
  • 遇到冲突不想现在解决或想要丢弃它

$ git merge --abort
  • 不想合并两个分支,只合并一个具体分支中的全部commit
$ git merge --squash 目标分支名

合并后可以在最终分支看到所有的操作历史,所以原本的分支标签或者名字就没有用了。

  • 清除分支名
$ git branch -d 分支名

network


  • 添加远端
$ git remote add 远端名称 url地址
如
$ git remote add origin https://github.com/username/test
  • 如果url写错了,可以更改url
$ git remote set-url 远端名 https://....
  • 删除远端
$ git remote rm 远端名
  • 查看所有远端
$ git remote -v
  • 查看有远端追踪的分支
$ git branch -r
  • 假设将github上的feature1分支拉取下来,先将github所有关于分支的最新信息更新到远端追踪的origin/featre1,然后再将该分支内容与本地合并
$ git checkout feature1
$ git pull orgin
  • fetch只是将github所有关于分支的最新信息更新到远端追踪的origin/featre1
$ git fetch origin
  • 将本地信息发送到远端,如github。这个过程同样会更新远端追踪的分支origin/featre1
$ git push orgin

fork


fork将别人的项目拷贝过来,并为其新建一个分支。对自己账号下的备份进行修改后,可以通过pull request将变更内容返回给原始开发者

pull request


将一个修改提交到他人的代码仓库中作为提议。

如果有权push到仓库,也应该在工作分支上发送pull request来获得代码的review。当你创建了分支,开始提交,并准备好接受别人的review时,就要将pull request将提交发送给团队中的每一人.

在这里,pull request不仅仅是一次提交,而是一次对话,他人对你代码的同一或反对以及审核都会展示出来。

github有持续集成系统,成员所在分支的每次合并都会通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误,并与会话一起报告出来。相当于进行了一次预先的合并,并展示给你合并的结果。如果合并成功运行,那么就可以进行merge pull request

reset


reset一共有3种模式:soft,mixed(default),hard

mixed模式会在status中显示。当对暂存区有改动时,查看status,会看到提示

use "git reset HEAD <file>..." to unstage
  • 这允许我们将这些该改变移除暂存区,将他们放回工作目录。
$ git reset HEAD
  • soft下,当做出一些改动,且改动太过于分散,比如提交了5个commit都属于一个事项,通过下面命令可以将最新的5个提交当作一次提交。
$ git reset --soft HEAD~5
  • 想要完全丢弃某些改动
$ git reset --hard HEAD~3

reset是针对整个文件系统历史的改动,checkout则更加关注精确到目录或文件的改动,它可以回到一个特定文件的某次提交的历史上,然后把这个文件和版本拉回到我们目前的工作目录。

reflog


追踪对修改内容的修改。

  • 打印出大部分最近的历史
$ git reflog
  • 使用打印出的所有历史中的7位hash串,加上reset,可以强制恢复到改历史的状态。
$ git reset --hard e4215cd
  • Reflog提供的线性历史可读性低,哪一个是独立的分支?哪一个是不在代码库里一部分的提交。通过gitk可以把reflog的结果通过管道到一个图形用户界面
$ gitk --all ‘ git reflog | cut -c1-7 ’ &

rebase


将已存在的提交,放到今天开始的一个分支上。
当你想为bug修复创建一个新的分支,且向将历史的一些修复一起整合到新的分支上来。

$ git checkout 功能分支
$ git rebase 原来的分支(一般是master分支)

这个操作会检查功能分支上的所有提交,并在主分支上重写,让其仿佛是从最新的时间点开始的

一般持续更新的web应用都是用merge优化而非rebase

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值