Git的理解和使用

Git介绍

Git(the stupid content tracker)是一个源自Linux内核项目的源码管理工具。和传统的CVS、SVN不同,git是一个分布式源码管理工具。

Git命令简单说明
git init初始化一个本地的代码仓库。
git clone从远程复制一个代码仓库。
git configgit选项设置。
git add添加文件/目录。
git commit提交修改。
git status显示工作目录的状态以及缓冲区内的快照。
git log已提交快照的日志。
git branch创建分支。
git checkout迁出/拉出/切换到一个分支。
git merge合并分支。
git revert撤销commit快照。
git reset撤销本地工作目录的修改。
git clean删除代码仓库以外的文件。
git remote管理远程git。
git fetch从远程获取分支。
git pull从远程获取分支。
git push把代码推到远程分支。

这里列举几个常见的git命令,让大家过过目 
基本操作 

git init //初始化版本库 

git clone //克隆版本库 

07 >git add //添加新文件 

git commit //提交到本地版本库 

git checkout //检出(分支、标签) 

分支 

git branch //列出分支 

git branch -r //列出远程分支 

git branch -a //列出所有分支 

git branch newBranch //基于当前分支创建新分支newBranch 

git branch -D branchName //删除分支branchName 

git branch -d branchName //仅删除已合并分支branchName 

git merge <--> //合并分支<br>>git tag  
历史 

git log //显示全部历史 

git log -p //显示版本历史,以及版本间的内容差异 

git log -5 //显示最近的5个提交 

git log -5 -p //显示最近的5个提交,以及版本间的内容差异 

...(很多很多参数...) 


git diff 112 115 //显示112和115版本的差别 

基本概念

文件状态

Git仓库中的文件有几种状态:

  • untracked - 还没添加到仓库中。
  • unmodified - 自上次提交以来,文件未曾修改过。
  • modified - 文件修改了还没提交。
  • staged - 文件提交到了暂存区中。一旦执行git commit就会转换为unmodified状态。

当我们往工作目录添加一个文件的时候,这个文件默认是未跟踪状态的,我们肯定不希望编译生成的一大堆临时文件默认被跟踪还要我们每次手动将这些文件清除出去。用以下命令可以跟踪文件:

git add <file>

Git暂存区(Staged Area)的意思是:你把一个文件托付给Git跟踪(git add),然后又修改了它,此时这个文件就位于暂存区了。暂存区内的文件几乎只做一件事:等待你执行git commit,把它提交。

上图中右边3个状态都是已跟踪状态,其中的灰色箭头只表示untracked<-->tracked的转换而不是untracked<-->unmodified的转换,新添加的文件肯定算是被修改过的。那么,staged状态又是什么呢?这就要搞清楚GIT的三个工作区域:本地数据(仓库)目录,工作目录,暂存区,如下图所示:



git directory就是我们的本地仓库.git目录,里面保存了所有的版本信息等内容。

  working driectory,工作目录,就是我们的工作目录,其中包括未跟踪文件及已跟踪文件,而已跟踪文件都是从git directory取出来的文件的某一个版本或新跟踪的文件。

  staging area,暂存区,不对应一个具体目录,其时只是git directory中的一个特殊文件。

  当我们修改了一些文件后,要将其放入暂存区然后才能提交,每次提交时其实都是提交暂存区的文件到git仓库,然后清除暂存区。而checkout某一版本时,这一版本的文件就从git仓库取出来放到了我们的工作目录。

快照(snapshot)

Git与其他版本控制系统的区别在于:Git只关心文件是否变化,而不关心文件内容的变化。大多数版本控制系统都会忠实地记录版本间的文件差异(diff),但Git不关心这些具体差异(哪一行有什么变动),Git只关心哪些文件修改了哪些没有修改,修改了的文件直接复制形成新的blob(这就是所谓的快照snapshot)。当你需要切换到或拉出一个分支时,Git就直接加载当时的文件快照即可,这就是Git快的原因。说起来,这也是用空间换取时间的经典案例。

从这个角度看,Git更像是一个小型文件系统,并在这个系统上提供一系列的工具来辅助开发。

Git的地理观

Git是一个分布式的版本控制系统,因此没有所谓的中心。粗略来看Git可分为本地库(local repository)和远程库(remote repository),细致地看可分为以下几个部分:

  • Working Directory - 工作目录。Git仓库位于工作目录之下,工作目录下的文件有加入Git仓库(tracked)和没加入Git仓库(untracked)的区别。
  • Stage Area - 暂存区。如上所述,已加入Git仓库并被修改(尚未提交)的文件。
  • Local Repository - 本地仓库。
  • Remote Repository - 远程仓库。

文件通常是:加入Git仓库(git add)-> 修改后即位于暂存区 -> 提交到本地库(git commit) -> 推送到远程库(git push)。



origin/master

这里主要笔记一些在Git上下文中经常遇见的术语。origin/master指远程仓库origin的master分支。

远程仓库/分支

这样的形式。虽然Git是分布式的系统,但通常把git clone的源头叫做origin,origin也被视为中心仓库(Central Repository)。

git入门

创建目录,并用git init初始化:

$ mkdir learn-git && cd learn-git
$ git init
Initialized empty Git repository in /tmp/learn-git/.git/

git init输出可知,git创建了一个名为.git的隐藏目录。

创建一个文件,并用git add添加到仓库,用git commit提交:

$ echo "hello git" > README.txt
$ git add .
$ git commit -m "readme file"
[master (root-commit) cd27ac1] readme file1 file changed, 1 insertion(+)create mode 100644 README.txt

接下来对已提交文件做一些修改,并新添加一个文件:

$ echo "learn files here" >> README.txt
$ cp ~/.vimrc .

git diff查看文件差异(每次commit前应该先diff对比差异详情):

$ git diff
diff --git a/README.txt b/README.txt
index 8d0e412..0219596 100644
--- a/README.txt
+++ b/README.txt
@@ -1 +1,2 @@hello git
+learn files here

差异对比可以用git diff --cached保存下来(如此差异则不输出到屏幕)。

git status查看git仓库状态:

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   README.txt
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .vimrc
no changes added to commit (use "git add" and/or "git commit -a")

这里显示README.txt被修改了,而.vimrc则等待添加。接下来,我们将.vimrc添加到git仓库中,且将所有修改一并提交(git commit -a):

$ git commit -a -m "update readme && add vimrc"
[master f6162f0] update readme && add vimrc2 files changed, 123 insertions(+)create mode 100755 .vimrc

git log输出git日志,包括提交编号(如"f6162f04170e3665bc03744e43f764c903e4e38d"这样的字串)、提交者、提交日期和提交日志。

git log的其他输出:

$ git log -p                    # 详细日志,并输出到分页程序
$ git log --stat --summary

美化git log输出

$ git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --

修改全局配置:

$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --"
$ git lg

管理分支

创建一个分支:

$ git branch exp

查看当前git仓库的所有分支:

$ git branchexp
* master

切换到exp分支:

$ git checkout exp
Switched to branch 'exp'

修改文件,并提交:

$ echo "start branch: exp" >> README.txt 
$ git commit -a -m "modified readme in exp branch"
[exp 2e825a4] modified readme in exp branch1 file changed, 1 insertion(+)

切换回master分支:

$ git checkout master
Switched to branch 'master'

master分支检查文件,可见exp分支的修改并没影响到master分支(注意,在exp分支的修改都已提交;如果没有提交,则切换回master分支会看到文件已变)。接下来我们制造一个冲突:

$ echo "return branch: master" >> README.txt                    
$ git commit -a -m "modified readme in master branch"
[master 8dd9fb2] modified readme in master branch1 file changed, 1 insertion(+)

git merge exp合并分支:

$ git merge exp
Auto-merging README.txt
CONFLICT (content): Merge conflict in README.txt
Automatic merge failed; fix conflicts and then commit the result.

从git输出可见,git尝试自动合并但失败了,因此提示需要解决冲突再提交

git diff查看差异,且差异文件被修改:

$ git diff
...
$ cat README.txt 
hello git
learn files here
<<<<<<< HEAD
return branch: master
=======
start branch: exp
>>>>>>> exp

手工解决冲突并再次提交:

(edit file)
$ git commit -a -m "do merge"

接下来,可以删除exp分支:

$ git branch -d exp
Deleted branch exp (was 2e825a4).

git branch -d删除分支时会检查分支是否完全合并到主干,如果不是,则会删除失败,并提示需要合并:

$ git branch exp                        # 建立exp分支
$ git checkout exp                      # 切换到exp分支
$ echo "exp again" >> README.txt        # 修改并提交
$ git commit -a -m "exp again"
[exp 868e68c] exp again1 file changed, 1 insertion(+)
$ git checkout master                   # 切换回master
Switched to branch 'master'
$ git branch -d exp                     # 删除失败
error: The branch 'exp' is not fully merged.
If you are sure you want to delete it, run 'git branch -D exp'.

可以用git branch -D exp忽略修改,完全删除分支:

$ git branch -D exp
Deleted branch exp (was 868e68c).

查看远端git

基础命令是:git remote show, git remote show X。

$ git remote show
origin
web

查看GitHub默认设置的origin

$ git remote show origin
* remote originFetch URL: git@github.com:berlinix/blog.gitPush  URL: git@github.com:berlinix/blog.gitHEAD branch: masterRemote branch:master trackedLocal branch configured for 'git pull':master merges with remote masterLocal ref configured for 'git push':master pushes to master (fast-forwardable)

git命令快查

以下列出一些常用的git命令

命令说明
基础操作
git init初始化git仓库
git add X添加X文件/路径到git仓库
git commit -m "COMMENTS"提交更新
分支管理
git branch X创建一个名为X的分支
git checkout X切换到X分支
git merge X自动合并X分支
git branch -d X删除X分支,需要先merge
git branch -D X强制删除X分支,忽略其修改,无须先merge
与远程git交互
git remote show显示远程git仓库
git remote show X显示远程git一个名为X的仓库
git push origin master更新提交到GitHub

Git日常问题

撤销commit

刚与master合并并提交后就后悔了现在要做的是撤销commit(revoke/undo merge/commit)。

查看当前所在分支:

$ git branchbs3
* coindevmaster

查看日志:

$ git log --oneline
9b7ba39 merged with master
73a66e8 update FAQ

用以下2个命令来撤销提交(把COMMIT_SHA替换为实际的SHA值;把HEAD~N中的N替换为一个数字,表示回退几步):

$ git reset --hard COMMIT_SHA
$ git reset --hard HEAD~N

例如回退到合并前:

$ git reset --hard 73a66e8
HEAD is now at 73a66e8 update FAQ

回退后发现不对,因为现在这个commit还是在master中的(在merge之前master已经走的太远),赶紧再次reset到merge时的状态:

$ git reset --hard 9b7ba39
HEAD is now at 9b7ba39 merged with master

如此一来就是就是merge后commit之前的状态。接下来就是要完成undo merge(已经undo commit了):

$ git revert -m 1 9b7ba39

这下就彻底回到merge前了,以防万一再次检查:

$ git diff --name-status master..coin

看起来没什么问题了,检查下日志:

$ git log --oneline
2691516 Revert "merged with master"
9b7ba39 merged with master
73a66e8 update FAQ

用git找回已删除文件

首先找到与目标文件相关的最后一次commit。如果目标文件没有出现在HEAD commit中,那么在这次commit时,文件就被删除了:

$ git rev-list -n 1 HEAD -- htdocs/myfile.php
1e8182f58dc038c8e6bc2025e8430f463d372030

接下来就是恢复工作了:

$ git checkout 1e8182f58dc038c8e6bc2025e8430f463d372030^ -- htdocs/myfile.php

合并分支的部分文件

有时候只想合并分支里的部分文件,而不是整个分支,可以用这个命令:

git checkout BRANCH FILE ...

例如,从test_branch分支中合并file_modified文件:

$ git checkout test_branch file_modified

参考Git Tip: How to "Merge" Specific Files from Another Branch。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【v3.6.2】iNeuOS工业互联网操作系统,发布实时存储方式:实时存储、变化存储、定时存储,设备振动状态和电能状态监测驱动...

目 录1. 概述... 12. 平台演示... 23. 存储方式... 24. 设备状态和用电状态监控驱动... 31. 概述本次升级主要增加了对设备实时数据的存储方式、设备振动状态驱动和用电状态监控的驱动&#xff0c;并且优化了部分核心代码。2. 平台演示在线演示&…

查询子串_SQL视图、子查询和常见函数的应用

一、视图含义&#xff1a;虚拟表&#xff0c;和普通表一样使用&#xff0c;通过表动态生成的数据。创建语法的关键字是否实际占用物理空间使用视图CREATE VIEW没有&#xff08;只保存了SQL逻辑&#xff09;增删改查&#xff0c;一般不能增删改表CREATE TABLE占用&#xff08;保…

The application could not be verified

2019独角兽企业重金招聘Python工程师标准>>> //调试的时候出现 The application could not be verified删除已安装的app&#xff0c;再Run 转载于:https://my.oschina.net/liuchuanfeng/blog/550025

git之you can‘t overwrite the remote branch问题解决

今天使用smartGit提交代码的时候出现这个错误&#xff0c;如图&#xff0c; remote是远程的意思&#xff0c;branch是分支的意思&#xff0c;you cant overwrite the remote branch英文的意思是我的remote branch被移动位置了&#xff0c;应该选中edit下面的prefrences下面的al…

数据分析和数据挖掘的理论研究必要性

2019独角兽企业重金招聘Python工程师标准>>> 数据分析&#xff0c;并不抽象&#xff0c;传统的数据分析&#xff0c;包括很多。例如信号处理中的DCT&#xff0c;滤波&#xff0c;IDCT变换。由于确定了滤波窗口的特性&#xff0c;使得对一个时间轴上的数据进行了频谱…

这个国家太奇怪了!全球最落后的国家之一,却又是世界上最幸福的国家!

全世界只有3.14 % 的人关注了爆炸吧知识中国和印度之间喜马拉雅山脉附近存在着一个弹丸小国国家人口仅有75万左右国土面积不足4万平方公里这里没有军队只有人们彼此诚挚的信任这里是最快乐的国度也是世间最神秘纯净的世外桃源这里是徒步天堂没有车水马龙的街道和红绿灯没有高楼…

嵌套饼图_旭日图的效率,高到饼图都羡慕

在展示占比情况时&#xff0c;饼图是我们最常用的选择。但是&#xff0c;饼图只能展示单层数据的占比情况&#xff0c;在面对多层级数据时&#xff0c;我们真的要用10个饼图进行可视化吗&#xff1f;不用挠头苦思&#xff0c;今天我们就来看看多个饼图的组合升级版——旭日图是…

Android之BaseAdapter—convertView回收机制与动态控件响应

前言&#xff1a;对于listView的BaseAdapter的派生&#xff0c;难度比较大。最难理解的莫过于getView(int position, View convertView, ViewGroup parent)这个函数是如何产生每条记录的&#xff0c;有些博客中利用holderView&#xff0c;有些博客却没有用&#xff0c;种种方法…

刚刚还在做菜,瞬间人就没了!厨房里一定不要再做这些事

全世界只有3.14 % 的人关注了爆炸吧知识厨房是一个家最有生活气息的地方&#xff0c;即使在外面&#xff0c;只要闻到别人家厨房飘出的饭菜香味&#xff0c;就很让人想家。但是&#xff0c;如果不注意细节&#xff0c;厨房也容易酿成悲剧&#xff01;今天&#xff0c;给大家看几…

poj 3125 Printer Queue(STL注意事项)

http://poj.org/problem?id3125 这道题没什么突出的地方&#xff0c;是一道很水的题&#xff0c;可以用list&#xff0c;也可以用queue来解决。&#xff08;用list解决的代码我就不写了&#xff09;把它写上来&#xff0c;只是因为我在使用STL的时候犯了一个小错误&#xff0c…

TCTDB存储结构

TCTDB是tokyo cabinet家族中的表格数据库&#xff08;如上图&#xff09;&#xff0c;其实现基于TCHDB&#xff08;hash database&#xff09;和TCBDB(B-tree database)。TCHDB参考&#xff1a;http://blog.chinaunix.net/space.php?uid20196318&doblog&id327754 TCBD…

Android之px 与 dp, sp换算公式

px: pixels(像素). 不同设备显示效果相同&#xff0c;一般我们HVGA代表320x480像素&#xff0c;这个用的比较多。 pt: point&#xff0c;是一个标准的长度单位&#xff0c;1pt&#xff1d;1/72英寸&#xff0c;用于印刷业&#xff0c;非常简单易用&#xff1b; sp: scaled pi…

05Prism WPF 入门实战 - Navigation

1.概要源码及PPT地址&#xff1a;https://github.com/JusterZhu/wemail视频地址&#xff1a;https://www.bilibili.com/video/BV1KQ4y1C7tg?share\sourcecopy\web本章分为以下三个部分来了解&#xff1a;Part1 视图导航、参数传递Part2 确认导航Part3 导航日志2.详细内容Part1…

明明没PS,看起来却像PS过的32张照片

全世界只有3.14 % 的人关注了爆炸吧知识现在PS太普遍&#xff0c;以至于人们看到不同寻常的东西&#xff0c;第一时间会怀疑经过技术处理。但也有一些照片&#xff0c;真的没有PS过&#xff01;1、这些轮胎痕迹令人产生了3D的错觉&#xff1a;2、截然分开的几种景观&#xff0c…

没有什么是日本牛郎店做不到的......

1 第一眼你看见了啥&#xff1f;▼2 确实很悲伤&#xff08;dy&#xff1a;李逍遥&#xff09;▼3 貌似真是这样▼4 我不爱打麻将咋办&#xff1f;▼5 短短十几个字&#xff0c;满满的江湖纷争▼6 少了男主的朋友不要轻易尝试▼7 哦吼▼8 双十一如你所愿&#xff0c;哈哈…

持续集成、持续交付(CI/CD)开篇,先来唠唠嗑

前言现在稍微有点规模的系统&#xff0c;很多都是采用分布式/微服务架构&#xff0c;将一个大系统拆分为很多个功能模块进行开发、测试、发布、管理等&#xff0c;如果全部流程都采用人工的形式进行的话&#xff0c;效率肯定是超级不高效滴。而且现在很多项目都采用极限编程的模…

100例经典炒菜_Python3经典100例(②)

实例6题目&#xff1a;斐波那契数列&#xff1b;分析&#xff1a;利用递归计算斐波那契数列&#xff0c;输入斐波那契数列的n位&#xff0c;调用递归计算出第n位的数列值&#xff1b;代码&#xff1a;#!/usr/bin/python3 # -*- coding: utf-8 -*- # Time : 2018-10-3 21:10 …

分享10个2012年最新发布的jQuery插件

为什么80%的码农都做不了架构师&#xff1f;>>> 日期&#xff1a;2012-5-9 来源&#xff1a;GBin1.com 本文收集了最新的jQuery社区发布的jQuery插件&#xff0c;绝对是你没有见过的&#xff0c;希望大家喜欢&#xff01; 1. SearchMeme 一个即时搜索的jQuery插件…

博士毕业的人也会交“智商税”?现实远比我们想象的残酷……

全世界只有3.14 % 的人关注了爆炸吧知识2018 年的那个多事之秋&#xff0c;我终于在人生快要过半的时候拿到了博士学位。大毛和小鱼是我博士期间玩得最好的兄弟&#xff0c;我们三人水平差不多&#xff0c;志向差不多&#xff0c;博士毕业后都进了双非高校。现实不像是想象中那…

聊一聊声明式接口调用与Nacos的结合使用

背景 对于公司内部的 API 接口&#xff0c;在引入注册中心之后&#xff0c;免不了会用上服务发现这个东西。现在比较流行的接口调用方式应该是基于声明式接口的调用&#xff0c;它使得开发变得更加简化和快捷。.NET 在声明式接口调用这一块&#xff0c;有 WebApiClient 和 Refi…