什么?作为程序员你都工作了还不会用Git
git管理文件和代码的使用
作者:hackett
微信公众号:加班猿
Git是一个免费的开源 分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有内容。Git易于学习, 占地面积小,具有闪电般的快速性能。它具有Subversion,CVS,Perforce和ClearCase之类的SCM工具,具有廉价的本地分支,方便的暂存区域和 多个工作流等功能。--《Git官网》
依稀还记得当初写论文的时候,保存的论文文档是这样子的,代码文件夹是这样的。根据需求删除或修改一些东西后另存为另一个文件,过一段时间后,想找回被删除的文字/代码,但是不知道保存在哪个文件里去了,想保留最新的一个把其他都删除掉,又怕哪天会用上不敢删除,真的烦人,这个时候就轮到我们强大的Git出场了,顺便记录一下自己从廖雪峰的官方网站Git教程的学习。
我工作中常用的指令
1、如果你没有项目的代码,组长一般都会给你一个链接,这时候你就可以用git命令 git clone
下来
git clone https://github.com/CodingEmbedded/mygit.git
2、接到主管的需求(此刻的我是想拿我的ZFB收款码出来的),一般来说都是新建一个分支的去开发的
git check -b 分支名
3、此时就可以愉快地写bug了,有时候同事/主管问你改了什么问题,你改了挺多不记得可以先 status
再 diff
一下可以看到我们修改了那些文件增删了那些内容
git status
git diff
4、写好之后就可以先 git add
再 git commit
进行本地代码的提交
git add
git commit -m "message"
5、提交到远程仓库需要用 push
git push
6、假如在你写的时候有人提交了代码,这时候你需要 pull
最新的代码下来
git pull
如果没有冲突就可以提交代码(有冲突的话就按照Git提示做修改再提交)
7、你的代码有一个致命bug,并且已经提交到了远程仓库,版本回退的方法: 先用下面命令找到要回退的版本的commit_id:
git reflog
然后回退版本:
git reset --hard commit_id
最后强制推送到远程分支:
git push -f
可以看到图1是提交了一个记录为“add or del”,图2图3为回退版本操作,图4图5对比可以看出git已经回退了
一、创建版本库
1、新建一个空目录(如下我是 E
盘 –> code
目录下新建一个 test
版本库)
2、通过 git init
命令把这个目录变成Git可以管理的仓库
3、 ls-ah
查看 .git
>目录和 ./
> ../
>,那是因为 .git
这个目录默认是隐藏的。
二、添加文件到仓库
1、编写一个文件 text.txt
2、使用命令 git add<file>
,可反复多次使用,添加多个文件,添加全部文件使用 git add-A
3、使用命令 git commit-m<message>
,完成, message
为提交的文本信息
三、查看工作状态和修改的文件
1、要随时掌握工作区的状态,使用 git status
命令。
2、如果 git status
告诉你有文件被修改过,用 git diff
可以查看修改内容。
四、git的版本回退
1、版本回退前,用 git log
可以查看提交历史,以便确定要回退到哪个版本。
2、HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间回退,使用命令
git reset--hard commit_id
。
3、Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本上一个版本就是 HEAD^
,上上一个版本就是 HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成 HEAD~100
。
4、要重返未来,用 git reflog
查看命令历史,以便确定要回到未来的哪个版本。使用命令 git reset--hard commit_id
。
五、暂存区
提交一个readme.txt的过程
六、管理修改
Git是如何跟踪修改的,每次修改,如果不用 git add
到暂存区,那就不会加入到 commit
中。
七、撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令 git checkout--file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令 git reset HEAD<file>
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考四、git的版本回退一节(用git log查看命令历史,以便确定要回到未来的哪个版本。使用命令 git reset--hard commit_id
),不过前提是没有推送到远程库。
八、删除文件
命令 git rm
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失 *最近一次提交后你修改的内容*
。
git checkout--<file>
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
九、添加远程库
第一步:在git下创建 SSHKey
。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有 id_rsa
和 id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ssh-keygen-t rsa-C"youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有 id_rsa
和 id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对, id_rsa
是私钥,不能泄露出去, id_rsa.pub
是公钥,可以放心地告诉任何人。
第二步:登陆GitHub,打开“Settings”,点 “SSHandGPG keys”
,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点 “AddKey”
,你就应该看到已经添加的Key:
第二步:创建一个GitHub账号,添加一个空的仓库。首先,登陆GitHub,然后,在右上角找到“new repository”按钮,创建一个新的仓库:在Repository name填入仓库名,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
目前,在GitHub上的这个仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
现在,我们根据GitHub的提示,在本地的仓库下运行命令: git remote add origin+ssh链接
使用命令 git push-u origin master
将内容推送上去。
注意:检查git的配置文件的邮箱还有用户名还有URL是否正确。才能进行下一步操作。
要关联一个远程库,使用命令 git remote add origin git@server-name:path/repo-name.git
;关联后,使用命令 git push-u origin master
第一次推送master分支的所有内容;此后,每次本地提交后,只要有必要,就可以使用命令 git push origin master
推送最新修改
十、从远程库克隆
要克隆一个仓库,首先必须知道仓库的地址,然后使用 git clone+ssh链接
命令克隆。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
十一、创建与分支(Git鼓励大量使用分支)
查看分支: git branch
创建分支: git branch<name>
切换分支: git checkout<name>
创建+切换分支: git checkout-b<name>
合并某分支到当前分支: git merge<name>
删除分支: git branch-d<name>
十二、解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。用 git log--graph
命令可以看到分支合并图。
十三、分支管理策略
准备合并dev分支,请注意 --no-ff
参数,表示 禁用Fastforward
, git merge--no-ff-m"merge with no-ff"dev
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
十四、bug分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作没有完成时,先把工作现场 git stash
一下,然后去修复bug,修复后,再 git stash pop
,回到工作现场。
十五、feature分支
开发一个 新feature
,最好新建一个分支;如果要丢弃一 个没有被合并过的分支,可以通过 git branch-D<name>
强行删除。
十六、多人协作
查看远程库信息,使用 git remote-v
;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用 git push origin branch-name
,如果推送失败,先用 git pull
抓取远程的新提交;
在本地创建和远程分支对应的分支,使用 git checkout-b branch-name origin/branch-name
,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用 git branch--set-upstream branch-name origin/branch-name
;
从远程抓取分支,使用 git pull
,如果有冲突,要先处理冲突。
十七、创建标签
命令 git tag<tagname>
用于新建一个标签,默认为HEAD,也可以指定一个 commit id
;
命令 git tag-a<tagname>-m"blablabla..."
可以指定标签信息;
命令 git tag
可以查看所有标签
用命令 git show<tagname>
可以看到说明文字
注意:标签总是和某个 commit
挂钩。如果这个 commit
既出现在 master
分支,又出现在 dev
分支,那么在这两个分支上都可以看到这个标签。
十八、操作标签
命令 git push origin<tagname>
可以推送一个本地标签;
命令 git push origin--tags
可以推送全部未推送过的本地标签;
命令 git tag-d<tagname>
可以删除一个本地标签;
命令 git push origin:refs/tags/<tagname>
可以删除一个远程标签。
最后总结一下Git的常用命令:
-
-
pwd
显示当前目录的路径。 -
git init
把当前的目录变成可以管理的git仓库,生成隐藏.git文件。 -
git add XX
把xx文件添加到暂存区去。 -
git commit –m “XX”
提交文件 XX是提交的注释。 -
git status
查看仓库状态 -
git diff XX
查看XX文件修改了那些内容 -
git log
查看历史记录 -
git reset --hard HEAD^
或者git reset --hard HEAD~
回退到上一个版本(使用
git reset –hard commit_id
回退到commit_id的指定版本 ) -
cat XX
查看XX文件内容 -
git reflog
查看历史记录的版本号id -
git checkout -- XX
把XX文件在工作区的修改全部撤销。 -
git rm XX
删除XX文件 -
git remote add origin + SSH链接
关联一个远程库 -
git push –u
(第一次要用-u 以后不需要)origin maste
r 把当前master分支推送到远程库 -
git clone + SSH链接
从远程库中克隆 -
git checkout –b dev
创建dev分支 并切换到dev分支上 -
git branch
查看当前所有的分支 -
git checkout master
切换回master分支 -
git merge dev
在当前的分支上合并dev分支 -
git branch –d dev
删除dev分支 -
git branch name
创建分支 -
git fecth
手动拉取远程仓库更新的信息 -
git stash
把当前的工作隐藏起来 等以后恢复现场后继续工作 -
git stash list
查看所有被隐藏的文件列表 -
git stash apply
恢复被隐藏的文件,但是内容不删除 -
git stash drop
删除文件 -
git stash pop
恢复文件的同时 也删除文件 -
git remote
查看远程库的信息 -
git remote –v
查看远程库的详细信息 -
git push -u origin/master
Git将会强制提交到master
分支上 -
git --amend
简单地来说,可以理解成对最后一次提交做修正。<前提是当前最后一次提交没有merge
参考文献
- Git教程 - 廖雪峰的官方网站 https://www.liaoxuefeng.com/wiki/896043488029600
如果你觉得文章还不错,记得"点赞关注"
关注我的微信公众号【 加班猿 】可以获取更多内容