Python全栈开发之Git

No.1 Git

特点

  • 版本控制:可以解决多人同时开发的代码问题,也可以找回历史代码
  • 分布式:Git是一个分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上,首先会有一台计算机充当服务器,这台计算机7*24小时服务,其他计算机都是从这台计算机克隆一份代码到自己的计算机中,并且各自把各自的修改提交到服务器仓库里,也可以从服务器仓库拉取别人的提交

安装

sudo apt-get install git -y

No.2 版本创建与回退

使用

创建一个版本库

git init

创建一个版本

git add test.txt
git commit -m ‘v1.0‘

查看工作区状态

get status

查看版本记录

git log
git log --pretty=oneline 将每次提交放到一行显示
git log --pretty=oneline --graph 以图形化方式显示每次提交

版本回退

git reset --hard HEAD^ 其中HEAD表示当前最新版本,一个^表示回退一个版本,有几个^表示回退几个版本
git reset --hard HEAD~1 1表示回退一个版本,那么10就是回退10个版本
git reset --hard HEAD

查看操作记录

git reflog

工作区、暂存区、版本库

  • 计算机中的目录就是一个工作区
  • 工作区中有一个隐藏目录.git,就是版本库,版本库中存在了许多东西,其中最重要的是stage(暂存区),还有一个是git为我们自动创建的第一个分支master,以及指向master的HEAD指针,因此第一个分支是master,所以当我们执行git commit的时候是向master分支上推送,git add 文件是将修改后的文件放到暂存区,git commit是将暂存区中的数据提交到工作区

管理修改

echo ‘this is first line‘ >> test.txt
git add test.txt
echo ‘this is first line‘ >> test.txt
git commit -m ‘v1.1‘
git status # 发现第二次修改test.txt文件后,并没有真正的加入到工作区,所以并没有提交到版本库
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:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")

撤销修改

撤销对test.txt文件的修改

get checkout -- test.txt

如果要撤销暂存区的修改时

git reset HEAD test.txt

对比文件

对比工作区中的test.txt文件和版本库中的有什么不同

git diff test.txt HEAD -- test.txt

对比两个版本中test.txt文件的不同

git diff HEAD HEAD^ -- test.txt

删除文件

我们将目录中的test.txt删除,git知道我们删除了文件,但是工作区和版本库就不知道了,所以我们执行git status就可以知道哪些文件被删除了

rm -rf test.txt
git status

现在我们有两个选择,一是确定这个文件要被删除,二是确定这个文件误删

# 1.
git rm test.txt
git commit
# 2.
git checkout -- test.txt

No.4 分支管理

创建与合并

git把我们每次提交的版本形成一条时间线,这个时间线就是一个分支,目前,这个分支叫master,每次提交后HEAD指向master,master指向提交,每次提交,master都会向前移动一步,所以这条时间线越来越长,当我们创建分支slave后,HEAD指向slave,指向新提交,从此,再次提交就会将版本提交到slave分支,而master不变,当我们在salve分支上的工作完成了,就可以合并分支

  • 查看分支 git branch
  • 创建并切换分支 git checkout -b <name>
  • 切换分支 git checkout <name>
  • 合并分支 git merge <name>
  • 删除分支 git branch -d <name>

解决冲突

合并也不是一帆风顺的,比如说,我在工作区中有一个test.txt文件,这个文件中没有任何数据,我在master分支中向第一行增加了一行数据,提交到版本库中,然后切换到slave,在这个文件中新增加了一行数据,然后提交到版本库中,再进行合并就会出现冲突

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git checkout -b slave
Switched to a new branch ‘slave‘

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ cat test.txt
master:the new code

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ vi test.txt

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ cat test.txt
master:the new code
slave:the new code

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ git add test.txt

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ git commit -m ‘1.2‘
[slave 5035bfb] 1.2
 1 file changed, 1 insertion(+)

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ git checkout master
Switched to branch ‘master‘

[email protected] MINGW64 /d/Codes/Git/test (master)
$ cat test.txt
master:the new code

[email protected] MINGW64 /d/Codes/Git/test (master)
$ vi test.txt

[email protected] MINGW64 /d/Codes/Git/test (master)
$ cat test.txt
master:the new code
master:the new code

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git add test.txt

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git commit -m ‘1.3‘
[master e46f9b7] 1.3
 1 file changed, 2 insertions(+)

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git merge slave
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.

# 解决冲突
[email protected] MINGW64 /d/Codes/Git/test (master|MERGING)
$ cat test.txt
master:the new code
<<<<<<< HEAD
master:the new code

=======
slave:the new code
>>>>>>> slave

[email protected] MINGW64 /d/Codes/Git/test (master|MERGING)
$ vi test.txt

[email protected] MINGW64 /d/Codes/Git/test (master|MERGING)
$ cat test.txt
master:the new code
slave:the new code

[email protected] MINGW64 /d/Codes/Git/test (master|MERGING)
$ git add test.txt

[email protected] MINGW64 /d/Codes/Git/test (master|MERGING)
$ git commit -m ‘1.4‘
[master b252477] 1.4

分支管理策略

通常,合并分支时,git会尽可能的使用fast forward模式,但是有时候快速合并没有成功但是也没有冲突,这个时候会合并之后做一次新的提交

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ vi test1.txt

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ cat test1.txt
add new code

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ git add test1.txt

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ git commit -m ‘1.5‘
[slave 5fa46e2] 1.5
 1 file changed, 1 insertion(+)
 create mode 100644 test1.txt

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ git checkout master
Switched to branch ‘master‘

[email protected] MINGW64 /d/Codes/Git/test (master)
$ vi test.txt

[email protected] MINGW64 /d/Codes/Git/test (master)
$ cat test.txt
master:the new code
slave:the new code
master:add new code

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git merge slave
Merge made by the ‘recursive‘ strategy.
 test1.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 test1.txt

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git log --pretty=oneline
bee1e463867f605f16c3fbad6a50ea36f4e0b20a (HEAD -> master) 合并slave分支
5fa46e2ec62346526554b04b62a468afbde0f9ba (slave) 1.5
b2524777899baab52783e1b49360fedc1e6a7e50 1.4
e46f9b7b5c379238ddca5db70746bc4f9f8c5edc 1.3
5035bfba43172b02bdbb7447fd9ebb018e6f49f5 1.2
2ae2bcac4258f41cb1a1e3a3a81a572be80c28f9 1.1
8d3dee945a68e5996d9c088a9769f43fc5c75228 1.0

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git log --pretty=oneline --graph
*   bee1e463867f605f16c3fbad6a50ea36f4e0b20a (HEAD -> master) 合并slave分支
|| * 5fa46e2ec62346526554b04b62a468afbde0f9ba (slave) 1.5
* |   b2524777899baab52783e1b49360fedc1e6a7e50 1.4
|\ | |/
| * 5035bfba43172b02bdbb7447fd9ebb018e6f49f5 1.2
* | e46f9b7b5c379238ddca5db70746bc4f9f8c5edc 1.3
|/
* 2ae2bcac4258f41cb1a1e3a3a81a572be80c28f9 1.1
* 8d3dee945a68e5996d9c088a9769f43fc5c75228 1.0

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git branch -d slave
Deleted branch slave (was 5fa46e2).

但是快速合并分支后删除分支会丢失掉分支信息,所以我们很多时候需要禁用快速合并

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git checkout -b slave
Switched to a new branch ‘slave‘
M       test.txt

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ vi test2.txt

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ git add test2.txt

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ git commit -m ‘1.6‘
[slave 1e833e6] 1.6
 1 file changed, 2 insertions(+)
 create mode 100644 test2.txt

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ git checkout master
Switched to branch ‘master‘
M       test.txt

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git merge --no-ff -m ‘禁用快速合并‘ slave
Merge made by the ‘recursive‘ strategy.
 test2.txt | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 test2.txt

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git log --graph --pretty=oneline
*   cabeb0f4edc6617d27e1a7624be927a0f5f7da59 (HEAD -> master) 禁用快速合并
|| * 1e833e62109f3dd266883834bf11014d85c4a3dc (slave) 1.6
|/
*   bee1e463867f605f16c3fbad6a50ea36f4e0b20a 合并slave分支
|| * 5fa46e2ec62346526554b04b62a468afbde0f9ba 1.5
* |   b2524777899baab52783e1b49360fedc1e6a7e50 1.4
|\ | |/
| * 5035bfba43172b02bdbb7447fd9ebb018e6f49f5 1.2
* | e46f9b7b5c379238ddca5db70746bc4f9f8c5edc 1.3
|/
* 2ae2bcac4258f41cb1a1e3a3a81a572be80c28f9 1.1
* 8d3dee945a68e5996d9c088a9769f43fc5c75228 1.0

bug分支

软件开发中,出现bug是经常性的事情,在git中,每个bug可以通过一个临时分支来修复,修复后删除分支,假如突然出现一个bug就需要立即修复,但是该分支的工作还没有完成,没有完成就没办法进行提交,所以就用到了git中的保存现场功能(stash)

[email protected] MINGW64 /d/Codes/Git/test (master)
$ 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:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git stash
Saved working directory and index state WIP on master: cabeb0f 禁用快速合并

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git status
On branch master
nothing to commit, working tree clean

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git checkout slave
Switched to branch ‘slave‘

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ git checkout -b bug001
Switched to a new branch ‘bug001‘

[email protected] MINGW64 /d/Codes/Git/test (bug001)
$ vi test.txt

[email protected] MINGW64 /d/Codes/Git/test (bug001)
$ git add test.txt

[email protected] MINGW64 /d/Codes/Git/test (bug001)
$ git commit -m ‘bug001修复完成‘
[bug001 aab106b] bug001修复完成
 1 file changed, 1 deletion(-)

[email protected] MINGW64 /d/Codes/Git/test (bug001)
$ git checkout slave
Switched to branch ‘master‘

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ git merge bug001
Merge made by the ‘recursive‘ strategy.
 test.txt | 1 -
 1 file changed, 1 deletion(-)

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ git branch -d bug001
Deleted branch bug001 (was aab106b).

[email protected] MINGW64 /d/Codes/Git/test (slave)
$ git checkout master
Switched to branch ‘master‘

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git stash list
[email protected]{0}: WIP on master: cabeb0f 禁用快速合并

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git stash pop
gOn branch slave
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:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/[email protected]{0} (8fe9c203f75afc7929433faabc52e02a6d555ff4)

[email protected] MINGW64 /d/Codes/Git/test (master)
$ git status
On branch slave
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:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")

No.5 使用GitHub

添加ssh账户

如果某台机器需要与GitHub进行交互,那么就要把这台机器的ssh公钥添加到GitHub账户上

  1. 编辑.github文件,使用ssh-keygen -t rsa -C "邮箱地址",生成ssh密钥
  2. 点击账户头像后的下拉三角,选择settings,选择SSH and GPG keys选项,单击New SSH keys,复制id_rsa.pub文件里的内容,点击Add SSH key

克隆项目

git clone 项目地址

上传分支

git push origin 分支名称

跟踪远程分支

git branch --set-upstream-to=origin/slave master

当本地成功跟踪远程分支后,当修改代码后,只需要git push就可以将修改提交到远程

从远程分支拉取代码

git pull origin 分支名称

原文地址:http://blog.51cto.com/13559120/2306795

时间: 2024-08-01 04:50:38

Python全栈开发之Git的相关文章

Python全栈开发之21、django

http://www.cnblogs.com/wupeiqi/articles/5237704.html http://www.cnblogs.com/wupeiqi/articles/5246483.html http://www.cnblogs.com/yuanchenqi/articles/5786089.html 基本配置 一 常用命令 django-admin startproject sitename python manage.py runserver 0.0.0.0 python

Python全栈开发之17、tornado和web基础知识

一.web基础知识 学习web框架之前,先来看一下web基础知识,首先要明白其本质就是socket,用户对应一个socket客户端,但是如果从socket开始开发web应用程序那么效率太了,正确的做法是底层socket处理代码由专门的服务器软件实现,而对于真实开发中的python web程序来说也是一般会分为两部分:服务器程序和应用程序.服务器程序负责对socket服务器进行封装,并在请求到来时,先经过web服务器,对请求的各种数据进行整理封装.之后web服务器将封装好的数据传递给应用程序,应用

Python全栈开发之Django基础

[TOC] No.1 MVC&MTV MVC M全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增.删.改.查操作 V全拼为View,用于封装结果,生成页面展示的html内容 C全拼为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果 MTV M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理 V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答 T全拼为Template,与MVC中的V功能相同,负

Python全栈开发之Django进阶

No.1 静态文件处理 项目中CSS.JS.图片都属于静态文件,一般会将静态文件存到一个单独目录中,便于管理,在HTML页面调用时,需要指定静态文件的路径,Django提供了一种解析静态文件的机制,文件可以放在项目目录下,也可以放在应用目录下 在mysite/setting.py设置文件的物理路径 STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] 在static目录下创建css.js.

Python全栈开发之9、面向对象、元类以及单例

前面一系列博文讲解的都是面向过程的编程,如今是时候来一波面向对象的讲解了 一.简介 面向对象编程是一种编程方式,使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用.类就是一个模板,模板里可以包含多个方法(函数),方法里实现各种各样的功能,,对象则是根据模板创建的实例,通过实例,对象可以执行类中的方法,每个对象都拥有相同的方法,但各自的数据可能不同. 二.类.对象和方法 在Python中,定义类是通过class关键字,class后面紧接着是类名,类名通常

Python全栈开发之8、装饰器详解

一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了. 一.装饰器 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),装饰器的功能非常强大,但是理解起来有些困难,因此我尽量用最简单的例子一步步的说明这个原理. 1.不带参数的装饰器 假设我定义了一个函数f,想要在不改变原来函数定义的情况下,在函数运行前打印出start,函数运行后打印出end,要实现这样一个功能该怎么实现?看下面如何用一个简单的装饰器来实现

Python全栈开发之12、html

从今天开始,本系列的文章会开始讲前端,从htnl,css,js等,关于python基础的知识可以看我前面的博文,至于python web框架的知识会在前端学习完后开始更新. 一.html相关概念 html是 htyper text markup language 即超文本标记语言,超文本就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素,而标记语言:即标记(标签)构成的语言. 网页相当于HTML文档,由浏览器解析,用来展示的,静态网页即静态的资源,如xxx.html,动态网页是html代

Python全栈开发之5、几种常见的排序算法以及collections模块提供的数据结构

在面试中,经常会遇到一些考排序算法的题,在这里,我就简单了列举了几种最常见的排序算法供大家学习,说不定以后哪天面试正好用上,文章后半段则介绍一下collections模块,因为这个模块相对于python提供的基本数据结构(list,tuple,dict)不被人们所熟悉,但是如果你对他们了解的话,用起来也是非常方便高效的. 排序算法 一.冒泡排序(BubbleSort) 步骤: 比较相邻的元素,如果第一个比第二个大,就交换他们两个. 循环一遍后,最大的数就“浮”到了列表最后的位置. 将剩下的数再次

Python全栈开发之10、网络编程

网络编程就是如何在程序中实现两台计算机的通信,而两台计算机间的通信其实就是两个进程间的通信,进程间的通信主要通过socket(套接字)来描述ip地址(主机)和端口(进程)来实现的,因此我们学习网络编程,必须学习socket 一.socket socket模块是针对 服务器端 和 客户端Socket 进行[打开][读写][关闭],一个完整的套接字模型图如下图所示 在python中读写操作调用的函数有些不一样,下面我们来看一下一个完整的socket(TCP)在服务端和客户端的实现 # server.