前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Git从0到1

Git从0到1

作者头像
若与
发布于 2018-04-25 03:40:03
发布于 2018-04-25 03:40:03
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

本文只是帮助你入门,从一个不会使用git的小白,到会解决开发中常见的使用。 废话不多说,直接进入正题。

最远处

git

git是用于Linux内核开发的版本控制工具。与CVS、Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。git的速度很快,这对于诸如Linux内核这样的大项目来说自然很重要。git最为出色的是它的合并追踪(merge tracing)能力

安装

安装,其实很简单,和普通软件安装无异。这里不介绍了。

创建新仓库

创建一个目录,打开,然后执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git init

创建一个新的git仓库. 初始化git的方法有很多种

  • 在本地创建
  • 在gitlab或github上创建,git clone下来,
  • 图形界面上创建

远程

克隆仓库

执行如下命令可以创建一个本地克隆版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone /path/to/repository

如果实在远端服务器上的仓库,你的命令会是这样子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone username@host:/path/tp/repository

克隆仓库也有很多内容,比如修改仓库名之类的等等。

工作流

你的本地仓库由git维护的三棵组成。第一棵树是你的工作目录,它持有实际文件;第二个是暂存区(index),它像是缓存区,临时保存你的改动;最后是HEAD,它指向你最后一次提交的结果。

git工作原理

添加和提交

你可以提交更改(吧它们添加到暂存区),使用如下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git add <filename>
git add *
git add .

这是git基本工作流程第一步;使用如下命令以时间提交改动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git commit -m '代码提交的信息'

现在,你的改动已经提交到HEAD,但是没有提交到你的远端仓库。

推送改动

你的改动现在已经在本地仓库的HEAD中了。执行如下命令以将这些改动提交到远端仓库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git push origin master

可以把master换成你想要推送的任何分支。 如果你没有克隆现有的仓库,并欲将的仓库连接到某个远程服务器,你可以使用如下命令添加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git remote add origin <server>

如此,你就可以将你的改动推送到所添加的服务器上去了。

分支

分支是用来将特性开发绝缘开来的,在你创建仓库的时候,master是"默认的"分支。在其他分支进行开发,完成后再将他们合并到主分支上。 创建一个叫"feature_test"的分支,并切换过去:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git checkout -b feature_test
# or
git branch feature_test
git checkout feature_test

切换回主分支

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git checkout master

删除分支

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git branch -d feature_test

除非你将分支推送到远程仓库,不然该分支就是其他人不可见的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git push origin <branch>
更新与合并

要更新你本地仓库至最新改动,执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git pull origin <branch>

以在你工作目录中获取(fetch)合并(meger)远端的改动。 要合并其他分支到你当前分支(如master),执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git merge <branch>

在这两种情况下,git都会尝试去自动合并并改动。遗憾的是,这可能并非每次都成功,并可能出现(conficts).这个时候就需要你修改这些文件手动合并这些冲突(conflicts).改完后,你需要执行如下命令将他们标记为合并成功:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git add <filename>

在合并改动之前,你可以使用如下命令预览差异:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git diff <source_branch> <target_branch>
标签

为软件发布创建标签是推荐的。这个概念早已存在,svn中也有。你可以执行如下命令创建一个叫做1.0.0的标签:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git tag 1.0.0 abcdef1234

abcef1234是你想要标记的提交的ID的前10位字符,可以使用下列命令获取提交ID:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git log

你也可以使用少一点的提交ID前几位,只要它的指向具有唯一性。提交ID可以回滚。

log

如果想要了解蹦迪仓库的历史记录,最简单的命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git log

还可以添加一些参数来修改它的输出,得到自己想要的结果。只看某个人提交的记录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git log --auth=youdi

一个压缩后每一条提交记录只占位一行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git log --pretty=oneline

或者你想要通过ASCII艺术的树形结构来显示所有的分支,每个分支都标示了它的名字和标签:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git log --graph --oneline --decorate --all

看看哪些文件改变了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git log --name-status

这些只是你可以使用的参数一部分,更多可以查看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git log --help
替换本地改动

假如你操作失误(当然,这最好永远不要发生),你可以使用如下命令替换掉本地改动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git checkout -- <filename>

此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。 假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git fetch origin
git reset --hard origin/master
使用小贴士

彩色的git输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git config color.ui true

显示历史记录时,每一个提交信息只显示一行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git config format.pretty oneline

交互式添加文件到暂存区

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git add -i

下面介绍一些工作中常用的小技巧:

撤销刚刚git add(暂存区的文件)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git reset --hard <filename>
撤销暂存区中指定的commit之前的提交
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git reset --hard <commit的hash值>

注:--hard丢弃working directory中内容的修改 --soft保留working directory中内容的修改

修改commit最新一次的注释信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git commit -amend

会打开编辑器,可能是nano,或vim 修改以后,重新push到远端仓库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git push master origin  -f

另外:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git commit -amend -m 'msg'
修改commit的历史注释信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git rebase -i head~2

修改前2条提交记录

版本回退

版本回退,需要使用git commit提交ID,查看如下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git log

回到指定版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git reset --hard  <commit hash value>

远端仓库也回退

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git push origin <branch> -f
忽略文件

如果忽略文件,在仓库中创建 .gitignore

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim .gitignore
*.pyc
/tmp
database.config
.gitignore
.tmp

进行匹配,匹配成功文就不会添加到work directory.

储藏(Stashing)

经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。

“‘储藏”“可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git stash

查看储藏的信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git stash list

放出储藏

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git stash pop <stash index>
多个仓库,开发

在公司开发,一般都是将项目clone到自己名下的仓库中,进行开发,如何在本地拉去项目中最新的项目。 修改git配置文件 .git/config

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = git@github.com:jacksonyoudi/python-note.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
[remote "google"]
        url = git@github.com:google/python-note.git
        fetch = +refs/heads/*:refs/remotes/origin/*

按上面配置好以后 拉取项目最新代码,合并到本地

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git pull google master

推送到项目上,而非自己仓库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git push google feature

望见

git的内容就介绍到这里,以上都是皮毛,你只当做入门的初级文章即可,不必深究。如果有精力,希望你配置好github. 如想深入,建议官方文档。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.04.08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python | Python 新手不可错过的 Python 知识合集
来源:https://segmentfault.com/a/1190000018737045
咸鱼学Python
2020/04/08
1.5K0
万字长文Python面试题,年后找工作就靠这了
编译型语言:把做好的源程序全部编译成二进制的可运行程序。然后,可直接运行这个程序。如:C,C++
周萝卜
2021/02/25
5260
万字长文Python面试题,年后找工作就靠这了
精心整理170道Python面试题,建议先收藏
精心整理的 Python 相关的基础知识,用于面试,或者平时复习,都是很好的!废话不多说,直接开搞
周萝卜
2022/05/22
6620
精心整理170道Python面试题,建议先收藏
web端rtmp推拉流测试、抽帧识别计数,一键式生成巡检报告
本文旨在实现无人机城市交通智慧巡检中的一个模块——无人机视频实时推拉流以及识别流并在前端展示,同时,统计目标数量以及违停数量,生成结果评估,一并发送到前端展示。对于本文任何技术上的空缺,可在博主主页前面博客寻找,
用户11404404
2025/06/08
700
Python多线程与多进程详解:性能提升技巧与实战案例
文章链接:https://cloud.tencent.com/developer/article/2464989
一键难忘
2024/11/12
6540
Python多线程与多进程详解:性能提升技巧与实战案例
Python异步IO操作,看这个就够了
异步 IO 是一种并发编程设计,Python3.4 开始,已经有专门的标准库 asyncio 来支持异步 IO 操作。你可能会说,我知道并发用多线程,并行用多进程,这里面的知识已经够我掌握的了,异步 IO 又是个什么鬼?本文将会回答该问题,从而使你更加牢固地掌握 Python 的异步 IO 操作方法。
somenzz
2020/11/25
2.9K0
Python异步IO操作,看这个就够了
软件测试面试中都会问到哪些关于Python的问题?
答:Python是一门语法简洁优美, 功能强大无比, 应用领域非常广泛, 具有强大完备的第三方库,它是一门强类型的可移植、可扩展、可嵌入的解释型编程语言,属于动态语言。
霍格沃兹测试开发
2020/12/17
7810
python核心知识汇总(精编版)
你好啊,我是阿巩。转眼已连续更新一周了,可咱毕竟是讲Python的公众号,不来点Python基础干货就有些说不过去,就像茶馆里没有茶、犬舍里没有狗子、老婆饼里没有老婆(都什么乱七八糟的比喻?!)之前有写过篇万字长文,今天来根据面试常问的内容整理下,做个精编版。日拱一卒,让我们开始吧!
才浅Coding攻略
2022/12/12
1.5K0
Python面试题大全(一):基础知识学习
目录 Python基础 文件操作 1.有一个jsonline格式的文件file.txt大小约为10K 2.补充缺失的代码 模块与包 3.输入日期, 判断这一天是这一年的第几天? 4.打乱一个排好序的l
不吃西红柿
2022/07/29
7300
面试题目及答案
1 Python的函数参数传递 看两个例子: a = 1 def fun(a): a = 2 fun(a) print a # 1 a = [] def fun(a): a.append(1) fun(a) print a # [1] 所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。 通过id来看引用a的内存地址可以比较理解: a = 1 def fun(a): print "func_in",id(a) # func_in 413224
zhang_derek
2018/04/11
4.4K0
面试题目及答案
python多线程
1 多进程 # 多进程, import os import time from multiprocessing import Process # 启动时必须在 if __name__ 判断下,windows 必须,其他 无限制 # ================================================= # def func(args): # print("子进程:",os.getpid()) # print("子进程的父进程:",os.getppid()) #
Dean0731
2020/05/08
1.7K0
Python协程-asyncio、async/await
上面的代码也可以这样写,将15到21行换成一行await asyncio.gather(a(), b())也能实现类似的效果,await asyncio.gather 会并发运行传入的可等待对象(Coroutine、Task、Future)。
Cloud-Cloudys
2020/07/07
3.3K0
暑假爆肝整理这篇python基础教程,全是干货,学完基础就过关(收藏加好评吧)
本基础分为十个部分: 1-数字 2-字符串 3-列表 4-控制流 5-函数 6-数据结构 7-模块 8-深层输入与输出 9-异常和错误 10-类 11-标准库简介 12-协程
川川菜鸟
2021/10/18
6010
Python学习(十)---- python中的进程与协程
原文地址: https://blog.csdn.net/fgf00/article/details/52790360 编辑:智能算法,欢迎关注! 上期我们一起学习了python中的线程的相关知识
智能算法
2018/10/08
5560
Python进阶篇
大家好,我是易安!今天我们继续Python的学习,内容稍微有些多,不过我会尽可能举一些例子让你理解。
架构狂人
2023/08/16
1.1K0
Python进阶篇
Python基础知识总结(期末复习精简版)「建议收藏」
本文针对《Python语言程序设计基础 (第2版)》——嵩天 礼欣 黄天羽,此书进行简单知识总结。
全栈程序员站长
2022/09/06
2K0
Python基础知识总结(期末复习精简版)「建议收藏」
2019 Python 面试 100 问,你会几道?
1.通过headers反爬虫 2.基于用户行为的发爬虫:(同一IP短时间内访问的频率) 3.动态网页反爬虫(通过ajax请求数据,或者通过JavaScript生成) 4.对部分数据进行加密处理的(数据是乱码)
AI算法与图像处理
2019/06/03
1.2K0
Python 面试题大全系列(二)
如:("zhangfei", "guanyu"),(66, 80) -> {'zhangfei': 66, 'guanyu': 80}
周萝卜
2019/07/17
1.1K0
Python 面试题大全系列(二)
python协程
https://docs.python.org/zh-cn/3/library/asyncio.html
润森
2019/11/10
5200
[源码分析] 分布式任务队列 Celery 之 发送Task & AMQP
Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度。
罗西的思考
2021/04/22
4.1K0
推荐阅读
相关推荐
Python | Python 新手不可错过的 Python 知识合集
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档