Git基本使用

  • 1.什么是Git
    • 1.1 Git简介
    • 1.2Git的优点
  • 2.Git和SVN的区别
  • 3.Git常用命令
    • 3.1 设置用户签名
    • 3.2 初始化本地库
    • 3.3 查看本地库状态
      • 3.3.1首次查看(工作区没有任何文件)
      • 3.3.2 新增文件(hello.txt)
    • 3.4 添加暂存区
    • 3.5 提交本地库
    • 3.6 修改文件
    • 3.7 历史版本
      • 3.7.1 版本穿梭
  • 4.Git分支操作
    • 4.1 git查看、创建和切换分支
    • 4.2 git合并分支(正常合并)
    • 4.3 git合并分支(合并冲突)
    • 4.4 删除分支
      • 4.4.1 删除本地分支
      • 4.4.2 删除远程分支
  • 5.GitHub远程仓库
  • 5.1 GitHub的使用
    • 5.2 推送文件到远程仓库
    • 5.3 从远程仓库上拉取文件
      • 5.3.1. git clone
      • 5.3.2 git fetch
      • 5.3.3 git pull
  • 6. 一般开发流程操作
    • 6.1文件操作和状态
    • 6.2 一般开发流程
  • 参考资料

1.什么是Git

1.1 Git简介

  • Git是一个开源分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目。
  • Git是李纳斯·托沃兹( Linus Torvalds )为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
  • Git和常用的版本控制工具CVS,Subversion等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

1.2Git的优点

  • 大部分操作在本地完成,不需要联网
  • 速度快、灵活
  • 尽可能添加数据而不是删除或者修改数据
  • 分支操作非常快捷流畅
  • 与Linux命令全面兼容

2.Git和SVN的区别

  • SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己完成的版本提交到中央服务器。集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。
  • Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网,因为版本都在自己的电脑上。协同的方法是这样的:比如说自己在电脑上修改了文件A,其他人也在电脑上修改了文件A,这时,你们之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
  • Git工作机制

3.Git常用命令

命令名称 作用
git config --global user.name 用户名 设置用户签名
git config --global user.email 邮箱 设置用户签名
git init 初始化本地库
git status 查看本地库状态
git add 文件名 添加到暂存区
git commit -m “日志信息” 文件名 提交到本地库
git tag 查看本地所有tag
git reflog 查看历史命令
git log 查看历史提交

3.1 设置用户签名

签名的作用是区分不同操作者的身份。用户的签名信息在每个版本的提交信息中能够看到,以此确认本次是谁提交的。Git首次安装必须设置用户签名,否则无法提交代码。

3.2 初始化本地库

3.3 查看本地库状态

3.3.1首次查看(工作区没有任何文件)

3.3.2 新增文件(hello.txt)


文件红色说明还没提交到暂存区,如果提交到暂存区会变成绿色。

3.4 添加暂存区


添加到暂存区后,文件会变成绿色。如要删除暂存区的文件,使用 git rm --cached file ,只是在暂存区删除,不会删除本地工作区上的文件。

3.5 提交本地库

3.6 修改文件

修改文件后,再次查看状态,检测到文件已经被修改。

重新提交

3.7 历史版本

git reflog       查看版本信息
git log         查询版本详情信息

3.7.1 版本穿梭

git reset --hard 版本号     版本穿梭

reset是重置代码仓库版本
有三种模式
– soft、–mixed和–hard是三个恢复级别
Git切换版本,底层其实是移动head指针。

4.Git分支操作

命令名称 作用
git branch 分支名 创建分支
git branch -v 查看分支
git checkout 分支名 切换分支
git checkout -b 分支名 创建并切换到分支
git merge 分支名 把指定分支合并到当前分支上

4.1 git查看、创建和切换分支

4.2 git合并分支(正常合并)

在ypj分支修改了hello.txt,然后再master分支合并

4.3 git合并分支(合并冲突)

产生冲突的表现:后面的状态为 (MERGING)
pj@DESKTOP-R08NI28 MINGW64 /e/workspace/git (ypj|MERGING)

冲突产生的原因:合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改,Git无法替我们决定使用哪个,必须人为决定新代码内容。

4.4 删除分支

4.4.1 删除本地分支

本地分支是本地机器的分支,不会影响任何远程分支

git branch -d 分支名        删除本地分支

无法删除当前所在和查看的分支,如果要这样做,会提示有如下所示错误:

$ git branch -d ypj
error: Cannot delete branch 'ypj' checked out at 'E:/workspace/git'

因此,在删除本地分支之前,需要使用git checkout命名切换到你不想删除的另一个分支:

如果分支包含未合并的更改和未推送的的提交,则该-d标志将不允许删除本地分支。
这是因为任何其他分支都看不到提交,并且Git正在保护以免意外丢失任何提交数据。
如果执行这个操作,Git会显示一个错误:

如错误所提示,需要改用该-D标志

git branch -D 分支名

-D是 --delete --force 的意思,表示会强行删除本地分支,无论其合并状态如何。
但请注意,应该谨慎使用此命令,因为没有提示要求确定你的操作,仅当你绝对确定要删除本地分支时才使用它。

使用–merged与–no-merged可以查看列表合并或未合并到当前分支的分支。

git branch --merged      查看已经合并到当前分支
git branch --no-merged  查看未合并工作的分支

4.4.2 删除远程分支

远程分支与本地分支是分开的。它们是托管在远程服务器的存储库,与本地分支相比,本地分支是本地系统上的存储库。

git push origin -d 远程分支名

5.GitHub远程仓库

命令名称 作用
git remote -v 查看当前所有远程地址别名
git branch -r 查看远程所有分支
git branch -a 查看本地和远程的所有分支,远程分支会用红色表示
git remote add 别名 远程地址 起别名
git push 别名 分支 推送本地分支上的内容到远程仓库
git clone 远程地址 将远程仓库的内容克隆到本地
git pull 远程仓库地址别名 远程分支名 将远程仓库对于分支最新内容拉下来后与当前分支直接合并

5.1 GitHub的使用

  1. 首先注册GitHub账号

  2. 在本地创建一个ssh的key,因为GitHub是使用ssh服务进行通讯的

    ssh -keygen -t rsa -C "your_email@example.com"
    

    -t 指定密钥类型,默认是rsa,可以省略
    -C 设置注释文字,比如邮箱
    -f 指定密钥文件存储文件名,一般我们默认,让存储到默认路径以及默认文件名

    它会要求输入Enter file in which to save the key (/home/stephenzhou/.ssh/id_rsa)

    这里是生成的sshkey文件名,我们可以回车使用默认文件名
    除此之外还会让你输入

    Created directory ‘/home/stephenzhou/.ssh’.
    Enter passphrase (empty for no passphrase):

    这个密码会在让你push提交时候要输入的,除了git登录密码,还要输入这个密码,直接回车则空密码,这里我们直接回车
    接着会让你在此输入密码,验证这里依旧回车

    Enter same passphrase again:

    生成之后你就会看到这样的界面:
    使用以下命令查看生成的ssh

    cd ~/.ssh
    ls
    


    id_rsa是私钥,id_rsa.pub是公钥,ssh采用的是非对称加密。

    接着在GitHub添加你的公钥

    这样ssh就添加成功了!

    5.2 推送文件到远程仓库

    git remote add origin https://github.com/Pj-ship-it/git-demo.git
    

    error: remote origin already exists.出现这个报错说明已经存在origin远程库

    git remote -v           查看远程库信息
    git remote rm origin    删除关联的origin远程库
    

    删除后,重新关联远程仓库。

    然后使用git push推送到远程库

    git push -u origin master
    

    参数解析:

    push:将本地仓库与远程仓库合并。
    -u:将本地仓库分支与远程仓库分支一起合并,就是说将master的分支也提交上去,这样你就可以在远程仓库上看到你在本地仓库的master中创建了多少分支,不加这个参数只将当前的master与远程的合并,没有分支的历史记录,也不能切换分支。
    origin:远程仓库的意思,如果这个仓库是远程的那么必须使用这个选项。
    master:提交本地matser分支仓库。


    当出现以上情况可以用

    git config --global http.proxy    设置http代理
    git config --global --unset http.proxy    取消设置http代理
    

    5.3 从远程仓库上拉取文件

命令名称 作用
git clone 远程地址 将远程仓库的内容克隆到本地
git clone -b 分支名 克隆指定分支的内容到本地
git fetch 远程主机名 将远程主机的更新全部取回本地
git fetch 远程主机名 分支名 取回特定分支的更新
git pull 远程主机名 远程分支名:本地分支名 将远程主机的某个分支的更新取回,并与本地指定的分支合并

5.3.1. git clone

当我们远程有仓库时,想要关联到本地只需要使用git clone就可以,新建一个空目录,不要git init,使用git clone会自动帮我们初始化。还可以使用git clone -b 远程分支名拉取指定分支,例如最常用的git clone -b master.

5.3.2 git fetch

git fetchgit pull这两条指令都是我们更新代码的时候所使用的,所以和很多人搞不清楚这两者间的区别,先用一张图来理解一下这两条指令的概念:

git fetch 远程主机名是将远程主机的最新内容拉到本地,用户在检查了以及决定是否合并到工作本机分支中。通常是用来查看其他人的进程,因为它取回的代码对你本地的开发代码没有影响。
默认情况下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。

git fetch 远程主机名 分支名
比如,取origin主机的master分支
git fetch origin master

取回的更新,在本地主机要用“远程主机名/分支名”的形式读取。比如origin主机的master,就要用origin/master读取。取回远程主机的更新以后,可以在它的基础上,使用git checkout -b命令创建一个新的分支。

git checkout -b 新的分支 origin/master

上面命令表示,在origin/master的基础上,创建一个新分支。
此外,也可以使用git merge或者git rebase,在本地分支合并远程分支。

git merge origin/master
git rebase origin/master

5.3.3 git pull

git pull是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这个可以会产生冲突,需要手动解决。

git pull 远程主机名 远程分支名:本地分支名

比如,取回origin主机的dev分支,与本地的master分支合并

git pull origin dev:master

如果远程分支是与当前分支合并,则冒号后面的部分可以省略。

git pull origin dev

上面命令表示,取回origin/dev分支,再与当前分支合并。实质上,等同于先做git fetch,在做git merge

git fetch origin
git merge origin

在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪,也就是说,本地的master分支自动“追踪”origin/master分支。
Git也允许手动建立追踪关系。

git branch --set-upstream master origin/dev

上面命令指定master分支追踪origin/dev分支。
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
如果合并需要采用rebase模式,可以使用--rebase选项。

git pull --rebase 远程主机名 远程分支名:本地分支名

如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。
但是,你可以改变这个行为,加上参数-p就会在本地删除远程已经删除的分支。

git pull -p
等同于下面的命名
git fetch --prune origin
git fetch -p

6. 一般开发流程操作

6.1文件操作和状态

  • 现在执行git add .git add 文件名,文件将提交到暂存区,从这里开始追踪状态,以下操作均以此为基础。
    此时如果想把文件从暂存区移除,但是文件保存在工作区,也就是从追踪单中删除,要执行:git rm --cached 文件名
    如果想把文件从暂存区和工作区都删除,要执行:git rm -f 文件名
    此时修改了文件,在未git add/rm前撤销修改,要执行:git checkout –* 或git checkout --文件名(其实是用版本库覆盖工作区的修改)。
    如果已经做了git add,但为commit前想撤销,要执行git reset HEAD .git reset HEAD 文件名
    如果已经做了git rm,但还没commit前想撤销,要执行:git checkout – 文件名

  • 现在已经执行了commit,假设执行git log,找到这次提交的commit_id
    此时想取消这次commit,但是所做的修改不取消,要执行:git reset <commit_id>
    此时想取消这次commit,且不保留commit之前修改的代码,直接恢复commit前对应的这个commit_id版本,要执行git reset --hard <commit_id>

  • 现在已经执行了push
    此时想让远程库回退到指定的版本,要执行:git reset --hard <commit_id>,然后执行git push -f origin 分支名

6.2 一般开发流程

远程分支拉取到本地

  1. 新建文件夹myProject (假设远程分支叫dev)
  2. 进入myProject,执行git init (初始化git信息)
  3. 执行git remote add origin https://xxx.git (建立关联)
  4. 执行git fetch origin dev (拉取代码)
  5. 执行git checkout -b dev origin/dev (新建本地分支对应远程分支,并切换到这个分支)
  6. 执行git pull origin dev

开始开发后:

  1. 提交到暂存区 git add 文件名 或 git add .
  2. 提交到版本库 git commit -m “注释信息”
  3. 拉取远程库代码,解决冲突 git pull origin 远程分支名
  4. 更新后推送到远程库 git push origin 远程分支名 或 git push

参考资料

关于Git这一篇就够了
git-程序员常用命令
Git远程操作详解
Git官方文档
尚硅谷Git入门到精通全套教程

Git命令详解及工作实用流程相关推荐

  1. git命令详解( 四 )

    此篇为git命令详解的第四篇,话不多说,我们直接上知识点好吧 git Push 偏离的工作 gitPush: 此命令负责将你的变更上传到指定的远程仓库,并在远程仓库上合并你的新提交记录.一旦 git ...

  2. java开发中常用的Git命令详解

    java开发中常用的Git命令详解(IDEA内如何操作) 一:写这篇文章的目的是什么? 二:使用场景在哪里? 1:当我们要使用idea去git仓库拉代码时,首先我们的idea得配置git工具 2:项目 ...

  3. GitHub使用教程详解(下)——Git的安装以及Git命令详解

    上一篇GitHub使用教程详解(上)--官网操作指南[翻译],是针对官网的guide进行了翻译,其实个人来说,我是很不喜欢那么操作的,又要等待页面加载,操作又慢!程序员嘛,还是直接敲入命令代码更迅速高 ...

  4. git 命令详解_再次学习Git版本控制工具

    微信公众号:PHP在线 Git 究竟是怎样的一个系统呢?为什么在SVN作为版本控制工具已经非常流行的时候,还有Git这样一个版本控制工具呢?Git和SVN的区别在哪儿呢?Git优势又在哪呢?下面PHP ...

  5. awk命令详解【非常实用】

    shell三剑客:grep.sed.awk cut -c:字符数来截取 character -f:字段来截取 field -d:指定分隔符 默认是tab awk命令详解 awk其实可以看做一种编程语言 ...

  6. linux less命令详解(9个实用案例演示)

    1. 前言 本文主要讲解linux less命令,详细解释该命令的作用与演示相关用法. Do more with less. 学习在Linux中使用less的命令来查看大文件和跟踪日志文件.在本教程中 ...

  7. linux less 快捷键,Linux less命令详解(9个实用案例演示)

    1. 前言 本文主要讲解linux less命令,详细解释该命令的作用与演示相关用法. Do more with less. 学习在Linux中使用less的命令来查看大文件和跟踪日志文件.在本教程中 ...

  8. 【Git版本控制】Git命令详解

    文章目录 前言 1.展示帮助信息 2.回到远程仓库的状态 3.重设第一个 commit 4.查看冲突文件列表 5.展示工作区和暂存区的不同 6.展示暂存区和最近版本的不同 7.展示暂存区.工作区和最近 ...

  9. git命令详解( 三 )

    此篇为git命令的第三篇 目录 git Pull 模拟团队合作 Git Pull 在上一篇的结尾我们已经知道了如何用 git fetch 获取远程的数据, 现在我们学习如何将这些变化更新到我们的工作当 ...

最新文章

  1. Nature:肠道菌群代谢物调节肠道与免疫
  2. ajax返回304,jquery $ajax GET请求在IE浏览器兼容中遇到的304 cache请求的经验分享
  3. MySQL row_format引发的案例一则
  4. 本地连接出来的很慢解决方法
  5. 爬虫工具——Selenium和PhantomJS
  6. Dev-C++ 5.11安装教程
  7. ubuntu系统和ROS系统的版本对应关系
  8. PHP svn开发环境搭建,手把手搭建WAMP+PHP+SVN开发环境,wampsvn_PHP教程
  9. 线程池的 RejectedExecutionHandler(拒绝策略)
  10. nonzero的用法一则例子
  11. ai创造了哪些职业_关于创造职业的思考
  12. instanceof的用法①
  13. C++中10的N次方如何表示
  14. GIS应用技巧之景观格局分析(四)
  15. Mac运行Win 10画面出问题?教你如何修复这个问题
  16. windows版微信多开
  17. 拼多多数据分析面试题大合集(20个)
  18. 接口练习:猫狗案例扩展跳高功能
  19. Javad 方法,方法的重载,递归,类,类的构造方法
  20. yum安装报错:“Could not resolve host: mirrors.aliyun.com; Unknown error“--:-- ETA Trying

热门文章

  1. Kubernetes pod 状态出现 ImagePullBackOff 的原因
  2. JAVA 如何使用File类创建文件,文件夹
  3. 怎么样防止文档泄密呢?
  4. kali linux改root密码
  5. codeforces703B
  6. Math.atan和Math.atan2函数
  7. Hive-时间日期trunc-日期与数字截取函数
  8. css实例——太极八卦图
  9. 机器视觉系统硬件选型
  10. Timer 定时器相关类