Git管理python和软件开发项目入门版
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Git管理python和软件开发项目入门版,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含14599字,纯文字阅读大概需要21分钟。
内容图文
git 初识
Git历史说明:
- Linux 内核开源项目有着为数众多的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。
- 到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。 他们对新的系统制订了若干目标:
- 自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。 它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统(参见 Git 分支)。
SVN (Subversion)版本控制:SVN每次提交,都会在服务器 db/revs 和 db/revprops各创建一个以顺序数字编号命名的文件。
本地搭建项目管理
中文录入问题 在git安装目录下的 /etc/inputrc编辑添加 如:vim /etc/inputrc
# disable/enable 8bit input set meta-flag on set input-meta on set output-meta on set convert-meta off
ls命令显示中文,添加到环境变量/etc/profile
declare -x LESSCHARSET=utf-8 alias ls="ls --show-control-chars"
首次创建版本库及第一次提交。创建用户名和邮箱, 这里说明下 git config --system 和--global区别在于编辑的gitconfig不同,--system是所有用户的,global针对当前用户全局。system则编辑在/etc/gitconfig 可global则在/home/用户/.gitconfig。
git config --global user.name "Eternal Night" git config --global user.email EternalNight996@gmail.com
删除刚刚配置全局配置变量user
git config --unset --global user.name git config --unset --global user.email git commit --allow-empty -m "who does commit"
如果你没有配置用户名和Email则会出现错误
添加命令缩写如果是windows则去掉前面的sudo 这是全局用户设置,当前用户则去掉sudo组
sudo git config --system alias.st status sudo git config --system alias.ci commit sudo git config --system alias.co checkout sudo git config --system alias.br branch git config --global color.ui true
如果我没github上面的项目下载,我们就自定义一个项目类初始为存储库,可以用于上传github的根据地,或者输入 git init KBMonitor,这个项目就称为工作区
git init
ls -alh我们可以看到有个隐藏目录.git?就是git版本库(称为仓库,repository)
先测试下
echo "hello python" >test.py git add test.py我们再次执行git add test.py就会成功了,原因我也没深究,大致是git的安全机制吧,所以给予提示。 我们查看下我们刚刚添加的test.py,?? ?git st?等同于git status我们刚刚配置的缩写,这里提示如何删除添加的文件
git st
git ci -m "initialized" git grep "hello"等同git commit -m "initialized",-m?则是message的缩写, grep?工作区文件内容搜索
显示 .git仓库的绝对路径,和显示工作区的根目录, 列如我们要去git工作区的目录,则输入cd `git rev-parse --show-toplevel`
git rev-parse --git-dir git rev-parse --show-toplevel git rev-parse --show-prefix git rev-parse --show-cdup
可以自己试试这些命令的功
git log --pretty=fuller
我们之前添加的 commit都可以看的到。如果想要修改作者和Email则输入以下命令
git config --global user.name "new name" git config --global user.email "new email" git commit --amend --allow-empty --reset-author git log --pretty=fuller--amend是对刚刚的提交进行修补? ?--allow-empty?允许空白提交? ?--reset-author修改提交者 备份我们的项目,我们回到项目中, diff是能查看修改文件后与版本库中的文件的差异
git clone KBMonitor KBMonitor-bak echo "新信息">>test.py git diff git add test.py git commit -m "new test"
我们再次提交记录,并查看最新日记, --pretty=oneline 则是缩短简洁
git log --pretty=oneline ls --full-time .git/index
能看到 .git/index时间戳发生改变,每添加新的修改
工作区、版本库、暂存区原理图
我们可以看到add添加入.git版本库的index引索,我们用commit命令 -m添加时则将内容地址放进 HEAD(ref: refs/heads/master)所以我们接着查看.git/refs/heads/master我们发现我们的log当前地址 dd348d60f7894dbbea162fb152c94f64a212aa2a
git add newtest.py git rm --cached test.py git statusgit add其实是把文件放进暂存区,并不会添加成主要上传的文件,我们同时添加多几个不同的文件 在这过程中,如果我们执行 "test">>newtest.py,我们查看的时发现修改了信息 这里显示新修改内容未添加缓存,且提供建议方案:add更新内容?或者?回到未修改前的版本.
git restore newtest.py
这就回到暂存的版本了,我们重新添加内容
git clean -fd git checkout .
git clean -fd清除没有加入版本库的文件和目录, git checkout则加暂存区内容刷新到工作区
git fsck git fsck --lost-found git log --pretty=oneline find .git/objects -type f | xargs ls -alh
我们都能找到地址,接着我们随便个初始文件查看内容,长度为 40 bytes的哈希值格式的ID由16个十六进制组成
git show 3516a7567a1175444ef745d45987199ff1f52027
经过数次修改,我们原始文件依旧健在
回顾下我们刚刚所用的git diff命令原理图
git diff HEAD git diff master git diff --cached
我们来看怎么查询更多的日志信息
git log --pretty=raw
- commit ...........提交中的唯一标识
- tree ..............这是提交所对应的目录树
- parent ..........这是本地提交的父提交(上一次提交)我们对比下表,看在parent看到上一个commit的记录
git cat-file -t 4e167
通过部分关键地址查看类型
git cat-file -p 4e167 git cat-file -p dd34
for id in 4e167 dd34; do ls .git/objects/${id:0:2}/${id:2}*; done
这里重新学习下我们一直面对的密密麻麻的地址,是怎么组成以及含义,前面说了。40bytes的16进制地址,2个十六进制为一组8bit,则除以2乘以8.也就是20组8bit一共160Bit长度的哈希值。哈希值两个著名算法:MD5和SHA1(git用的就是这个算法)因为SHA1算法存在人为制作冲突的可能,可以用SHA-256或SHA-512算法
cat newtest.py |sha1sum.exe cat newtest.py |sha256sum.exe cat newtest.py |sha512sum.exe cat newtest.py |md5sum.exe cat newtest.py |sha1sum.exe |awk.exe -F' ' '{print $1}'|wc -c我除了用这种命令生成哈希值,也能测长度。 接下来我们比较实用,产品经理不断要求你修改版本,经过N次又绝对要回第一版。怎么办?
tail .git/logs/refs/heads/master
把头版的hash值复制好, --hard 替换引用指向>替换暂存区>替换工作区 --soft只改变指向,不改变暂存和工作 --mixed 或不使用则改变除 工作区外
git reset --hard 3516a7567a1175444ef745d45987199ff1f52027 git log git reset --hard master git log git checkout -b 3516a7567a1175444ef745d45987199ff1f52027 git reflog
发现只剩一个HEAD头文件记录了,checkout -b 添加头指针的指向
git checkout .
暂存区的的所有文件直接覆盖本地文件
echo "恢复如初" >>newtest.py git stash
再次打开就恢复如初了
echo "单文件恢复" >>newtest.py git checkout -- newtest.py
查看删除掉的内容前后文对比
git diff stash@{1}
git stash apply stash@{1}
git rm -f newtest.py git commit -m "delete trash file. (using: git rm)"git rm?还是 rm?删除都依旧能在缓存区恢复,我们接着使用git giff stash@{1},依旧可以寻找到刚刚除非的痕迹并恢复。?我们只有commit提交了才能实现意义上删除 结果就无法用缓存区去恢复工作区文件,但我们HEAD文件依旧指向我们初始文件,至于master是指向所有历史。 我们输入checkout .?和指定 test.py ,但我们已经无法恢复工作区文件,现在我们又奇思妙想想找回后面版本的某个数据怎么办? git reflog?查看总缓存记录
git reflog
我们找回之前的数据,我得利用起来,红线标识几乎都能利用。我们目的不会恢复,而是恢复里面某文件的数据,到我们原始版本下面。其中440deeb为他们的合集7位缩写,dd348...和3516a则是440deeb的子地址,HEAD@{39}为头文件指针,指向440deeb。如果说的不对请大佬指出,下面有几种方式寻找回之前记录,但是切记别使用checkout,因为checkout是直接覆盖内容的。下面的 ^意思是指向最近一个log所以也可以不添加。
git log 440deeb^ --pretty=raw git log HEAD@{39} --pretty=raw git log dd348d60f7894dbbea162fb152c94f64a212aa2a --pretty=raw
推荐用HEAD@{N}这种方法,信息比较全。那么我们找到的结果如下
我测试就取new test的文件下的内容。需要抓取tree的哈希值
git cat-file -p 4e16769f7fbc90f09b537e45e8606391f6417d2a git show ea8c26485e00ba0e832f897e9d4d7dcd9c011277 >new1.py?我们则找到了,指向文件内容的地址,复制起来。 我们内容则出来了。那我们转存到工作区的new1.py文件中
git也提供一种交互式的添加版本库的方法 git add -i
我们先创建多个文件,给多个文件存储信息
touch test{1..5}.py for n in {1..5}; do `echo "测试" >>test${n}.py`;done; git add -i 4 2-4
我们添加2-4的文件,之后按Enter既添加进暂存区.再选择1查看
如果我们选错了怎么取消?选择3 revert撤销我们不需要3
按7退出,我们提交内容到版本区既缓存
git commit -m "initialized (using: git add -i)" git log git clean -fd ls
我们把非HEAD指针的内容清理
我们回到初始版本
git reset --hard 3516a7567a1175444ef745d45987199ff1f52027
git tag标识版本
我们版本不断更新,为了更好管理我们会为更新的版本添加1.0或1.1甚至2.0。我们需要标识它先重命名为test_1.0.py,标识方便我们寻找相对应的文件版本
cat > test_1.0.py <<EOF #coding=GBK print("hello python.") EOF
git tag -m "set tag test_1.0.py" test_1.0.py git log
现在我们要删除掉这个标识
git tag -d test_1.0.py
gitk 图形工具 使用python Tcl/Tk开发,界面非常丑陋。而且只能用于版本库浏览
gitk --all
gitk --since="2 weeks ago"
查看所有 显示 2周以来的所有提交
穿梭时间版本原理结构图
我们前面做了大量的版本提交,已经回到各个版本。这种操作业内称为回滚版本,科学界称为穿梭时空。当我们的提交有6个时,我们的缓存则生成6条版本缓存分别用ABCDEF代替。我目前状态处于D版本
我们将用git reset 回到C版本下面图将显示发展情况,假设我的好朋友被混混干掉了,我们需要回到C时间段去阻止,那么朋友的命运则发生改变,之后我们处于的世界将分裂出第二个世界,以EF的规律重新发展下去。
我们再看一张图,先回到B时间戳之后我们不选择消灭混混,而是在他变坏之前去收服他。那么CD将合并发展。上面图则会跳过D
时间旅行回到过去消灭D
根据上面版本替换,之前的记录已经不能在git log直接看到,所我们通过缓存库直接查看git reflog指针是指向 .git/logs/HEAD的 其实HEAD后面添加的符号和数值,只是让头文件指针指向的地址。学过C语言的应该对这个比较清楚。
git log --oneline -6
git tag F HEAD git tag E HEAD^ git tag D HEAD^^ git tag C HEAD~3 git tag B HEAD~4 git tag A HEAD~5
我们标记的内容就可以马上运用起来,我们先回到C时间戳去消灭混混
git checkout C
DEF都没发生,也就是我们成功的回到了标记的时间戳里。我们的混混处于tag D既标记的HEAD^^。
git cherry-pick master^ git cherry-pick master git log --oneline -6
OK我们现在时间戳只剩ABCEF,D就不见了。
但是我们现在还是可以通过master去恢复带有D的历史。
git chekout maste
但是主线HEAD文件指针已经指向Cherry-picking就是我们分拣消灭D的历史。想要彻底消灭必须添加下面命令
git reset --hard HEAD@{1}
时间旅行回到过去收服D
先将HEAD指针指向混混D
git checkout D
git reset --soft HEAD^^
之前讲过--soft只改变指向,不改变暂存和工作,HEAD^^指向的地址不再是混混D,因为我们回到了D,所以HEAD^^就会指向B.
git commit -C C
-C则是重用C提交的说明
git cherry-pick E git cherry-pick F
这样我们CD就合并一起,且多了个E和F
关于gitk图形中文乱码解决
vim /c/Users/Administrator/.gitconfig [gui] encoding = utf-8
如果是在linux则vim ~/.gitconfig更简单的是直接输入命令,就会自动将上面格式的设置添加进/c/Users/Administrator/.gitconfig,这是用户全局变量
git config --global gui.encoding utf-8
如果是添加所有用户则输入
git config --system gui.encoding utf-8
如果进入了新线程的时间旅行,如果回到未来?且用其他方式实现上面两种影响未来的方法
只要标识没删掉就容易回到原来世界,如果删掉就需要找地址
git checkout master git reset --hard F
怎么直接修改过去导致影响未来?
git rebase D^
我们只要删除第一行混混,即可到达我们要的效果。 :wq 保存并退出
看未来已经被影响了
git checkout master git reset --hard F
回到未来原来的世界
第二个结局合并CD
git rebase -i C^
会出现第二个编辑日记窗口,说明合并一起了。 :wq保存退出
标识到底有什么用?除了上面做时间旅行外?
git cat-file -p A^{tree}A旁边的符号^是指向的意思,如果我们不添加{tree}则不需要添加指向,如果我们设置A{tree}则会报错。因为git会先找字符"A{tree}" 比起我们上面寻找tree文件的地址,我一直看这个地址是不是感觉很乱?尤其是历史文件多了,哈希值也随着变多。 我们标识起来,我们直接寻找标识就能轻松找出我们需要的文件或提交的版本。
GitHub和GitLab克隆线上管理库
形成历史:
2008年github正式启动,就是从本地库转换成线上库。 2019无限制的免费私有存储库产品
- GitHub Free 现在包含无限的私人存储库。开发人员第一次可以将 GitHub 用于他们的私有项目,每个存储库最多可以免费使用三个协作者。许多开发人员希望使用私有库申请工作,在侧面项目上工作,或者在公开发布之前私下尝试一些东西。从今天开始,这些场景以及更多场景可以在 GitHub 上免费使用。公共存储库仍然是免费的(当然 - 没有变化)并包括无限的合作者。
- GitHub Enterprise 是 Enterprise Cloud(以前称为GitHub Business Cloud)和 Enterprise Server(以前称为GitHub Enterprise)的新统一产品。希望灵活地在云或自托管配置中使用GitHub的组织现在可以以每个席位的价格访问这两个组织。通过 GitHub Connect,这些产品可以安全地链接,提供混合选项,因此开发人员可以跨两种环境无缝工作。
- GitLab 让开发团队对他们代码仓库拥有更多的控制,允许设置仓库权限,允许用户选择分享一个project的部分代码,允许用户设置Project的获取权限,可以设置获取到团队整体的改进进度。通过innersourcing让不在权限范围内的人访问不到该资源。
第一步还是先注册你的git web账号.我们配置上传github,先创建仓库
git init echo "#测试项目使用说明">>README.md git add README.md git commit -m "first github commit" git branch -M main git remote add origin https://github.com/EternalNight996/JUE.git git push -u origin main
我一个个解释用途 第一条:1.设置初始化仓库、2.创建说明可以要也可以不要、3.添加暂存 4.提交 5.设置为主要分支 6.添加远程线上地址https为源地址 7.把项目推源地址。如果没配置公钥,则需要输入账号密码。
我的项目就这么简单就可以推上web了,我们在网吧或者公司我们需要把项目完善就复制git地址,如果你记得账号和项目就直接输入就可以了.
这里提供多种方式下载,非命令行圈圈方式下载zip等。比较建议用git clone https直接输入账号和文件名+.git就方便点。其中还提供ssh和github CLI
git clone https://github.com/EternalNight996/JUE.git github1
第二种 ssh协议则需要配置公钥
git clone git@github.com:EternalNight996/JUE.git github2第三种?gh repo clone EternalNight996/JUE?我也没测试过所以不能提供用法 我们已经知道如何配置了,我们就添加公钥,让我们输入输出项目简单起来,你电脑得配置有ssh如果不知道怎么配置公钥和秘钥可以跟着下面教程。
ssh-keygen -t raw -C "Eternal@gmail.com"
一般输出到你用户的目录.ssh下如我WINDOWS的则在. /c/Users/Administrator/.ssh, id_rsa是秘钥不需要修改, id_rsa.pub是公钥。 known_hosts是你访问的机器的公钥,会添加进这里。如果你第一次登陆某机器就会提示警告就是因为无法识别公钥的安全性,成功登陆后则会添加进known_hosts。如果我们再次登陆机器则出现错误报告,就很大可能性是对方机器公钥替换了,ssh提取的known_hosts无法是被。解决办法清理known_hosts数据。
这里记录的就是我们刚刚登陆的github.com的公钥,正常是不会记录的。唯有上传仓库的项目需要利用到ssh,说远了我们先提取ssh公钥.手动复制
cat ~/.ssh/id_rsa.pub
下面这种是直接将内容复制到粘贴板,第二种pdcopy
clip < ~/.ssh/id_rsa.pub
登陆你的github
ssh -T git@github.com
说明成功了。
git clone git@github.com:EternalNight996/JUE.git github2
我用ssh协议下载项目试试
成功了。这里我们先登陆在github上新建一个项目为sshJUE
cd github2 git init echo "#测试项目使用说明">>README.md git add README.md git commit -m "second github ssh commit" git branch -M main git remote remove origin git remote add origin git@github.com:EternalNight996/sshJUE.git git push -u origin main
免密上传了GOOD,我们看下本地日记状态记录。我们可以看到HEAD指针指向了main, origin/main
到了这里,全部人门内容也就完毕了。如果有大兄弟跟着我们的整个笔记完的,可以关注我期待进阶版git笔记。因为我们前面所有内容都比较简单,属于入门级别,当然如果是简单的管理项目也就够了。
TO THE END
内容总结
以上是互联网集市为您收集整理的Git管理python和软件开发项目入门版全部内容,希望文章能够帮你解决Git管理python和软件开发项目入门版所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。