Git学习记录

来源:互联网 发布:马哥linux全套视频 编辑:程序博客网 时间:2024/06/05 11:00

这里主要以github来说,目前国内的码云也挺好用的(私有仓库免费),将项目上传至Github上有很多方法,基本的账号注册不废话。

一、GitBash(先下载)

1.创建本地SSH Key

直接打开Git Bash,输入以下命令

$ ssh-keygen -t rsa -C "your_email@youremail.com"

“your_email@youremail.com”就是账户邮箱,不需要“”号,接下来会提示密钥的存放路径,使用默认路径按Enter即可,然后提示设置密码,不使用密码登陆Enter即可,确认密码Enter即可。然后打开C:\Users\你的电脑名.ssh目录,下面会出现三个文件,用记事本这类工具打开id_rsa.pub文件,复制其中内容;

打开github网站,登陆后点击用户头像选中Settings,进入左侧菜单栏的SSH and GPG keys一栏,选择New SSH key创建SSH key,Title随便填,Key直接将刚刚复制的内容粘贴进去保存即可。然后切回Git Bash窗口验证是否配置成功

$ ssh -T git@github.com

如果出现是否确定连接,输入yes即可,如果出现

Hi xxx! You've successfull authenticated, but GitHub ...

那说明SSH验证成功

2.用GitHubDesktop上传项目到GitHub

登陆GitHub创建仓库,在Git Bash中进入本地仓库的目录(创建号好空目录后需要进入目录用git init指令初始化仓库),创建本地仓库(即当前所在目录)和远程仓库的关联

git remote add origin git@github.com:stormzhang/test.git

这里一定注意,现在我的删不掉了……现在解决了,见第5点。

如果中间运行遇见

fatal: Not a git repository (or any of the parent directories): .git

提示说没有.git这样一个目录,解决办法如下:运行git init就可以了!

【上传】
这里以CentOS7环境做演示,windows上用gitBash一样,然后上传东西,一般情况下首先进行需要进行提交文件的所在目录,然后添加状态跟踪,更新后提交

# 进入待提交文件的目录下(比如要提交一个叫做testGit的文件)cd xxx# 查看是否添加了testGit文件的状态跟踪git status# 如果已经添加状态跟踪跳过此步骤,如果提示没有状态跟踪的文件,则用以下命令添加需要进行状态跟踪的文件git add testGit# 再次查看是否跟踪文件状态git status# 修改文件后需要提交变更的内容git commit# 在git commit之后会提示让你输入提交说明(一定要填!否则不能提交)# 除此之外commit命令只是让修改提交到了本地仓库,并没有提交到远程仓库填写说明...# 提交commit的文件到github的远程仓库git push【注意】这里向远程推送的时候可能会报错:提示:更新被拒绝,因为远程版本库包含您本地尚不存在的提交。这通常是因为另外提示:一个版本库已推送了相同的引用。再次推送前,您可能需要先合并远程变更。。。此处是此用你的账户向自己的仓库推送,而不是向别人的仓库推送【解决方案】1.可以强推:git push -u origin +master​2.尽量先同步github上的代码到本地,在上面更改之后再上传,转到第7点代码冲突解决

3.利用EclipseGit插件上传项目

首先配置一下Git插件:Window–>Preferences–>Team–>Git–>Committing,取消勾选Use Staging View to ……

右击项目–>Team–>Git
进入Configure Git Repository窗口后,Repository一栏点击Create,如果没有本地Git仓库就自己选择目录创建一个,如果有就直接选择即可,然后finsh,此时项目就已经导入到本地Git仓库了(此时相当于单纯的文本复制)。

commit项目到本地仓库: 右击项目–>Team–>commit(这里面的Commit message必填!!)–>Commit

将commit后的代码上传到GitHub: 右击项目–>Team–>Remote–>Push,如果在基本配置中配置了关联仓库可以直接使用Configured remote repository,否则选择Custom URI手动选择URI(到GitHub网站上复制自己仓库地址即可),然后填写User、Password,这里注意User填写用户名不是邮箱。

配置Specification: Source ref选择master然后点击后面的Add Spec然后上传,如果失败回到这一步勾选Force Update再次Finsh即可

4.删除GitHub上的文件

原理基本都一样,首先进入自己的库,选择Clone or download,然后Open in Desktop,GitHub会自动在本地创建一个一样的本地库,如果想对其作修改,那么在项目修改后commit到本地库中后,然后push到远程github即可,或者直接在Clone的那个库中直接做修改

5.关联库的设置

$ git remote add origin(这个是仓库的名字,随便起,记住就行) git@github.com:Jacksonary/CodeRepository.git

关于第2部分的问题解决了,方案如下:
一定要先进入本地仓库的目录啊,不然会报乱七八糟的错误

# 首先进入与之关联的本地仓库目录cd ....# 查看与之关联的远程库git remote -v# 解除对应的绑定git  remote rm origin(即上面列出来的库名)# 绑定新的远程库git remote add origin(库名) gitt@github.com:Jacksonary/CodeRepository.git

详细如图
关联库的删除与绑定

偶然发现一片好文章,看这个吧,我的不用看了……
http://realroyhsu.coding.me/Git-remote-control-Cooding/index.html

6.clone项目到本地

进入自己的本地仓库目录(即创建一个空目录)

//进入xx目录cd xxx//将项目clone到该目录下(建议选用SSH地址复制粘贴即可)git clone 地址

7.代码冲突的解决

所谓的代码冲突,是指有多个人同时对文件进行的修改,版本控制工具无法取舍,git会保留多次的修改,在用户进行push操作时会提示如下的警告:

提示:更新被拒绝,因为远程版本库包含您本地尚不存在的提交。这通常是因为另外提示:一个版本库已推送了相同的引用。再次推送前,您可能需要先合并远程变更balabala....

此时可以执行以下的指令先将远程库的代码拉下来与本地代码合并
【注意】如果这一步,不进行commit,直接进行pull操作的话,本地代码将会被远程代码覆盖!这里一定先commit再pull

git pull

执行git diff将会显示冲突的地方

git diff

然后可以在本地可以正常修改冲突的地方,修改完后正常流程提交即可

# 不能少,类似于挂载,commit前一步必须只能是addgit add testGitgit commitgit push

8.代码回退和进行

1.回退

# 查看推送日志git log

执行这个命令后会出现所有的推送日志,比如下面的:
【注意】最上面的是最新推送的,最下面是最早推送的

[root@localhost test]# git logcommit e0dfaa1b163cae0f69b0d3805224e6d6750e2623Merge: aa46c2f 06b124bAuthor: root <root@localhost.localdomain>Date:   Wed Nov 29 19:08:51 2017 +0800    Merge branch 'master' of github.com:Jacksonary/LinuxCodeRepository    CentOS7update    Conflicts:        test/logcommit aa46c2fd3e21b9a528eadf821e6e601863dcc23dAuthor: root <root@localhost.localdomain>Date:   Wed Nov 29 19:05:33 2017 +0800    CentOS7 commitcommit 06b124b6be29b3504fd6228111b33e07ec24753dMerge: ec0a010 7a62620Author: jacksonary <jacksonary@163.com>Date:   Wed Nov 29 19:01:02 2017 +0800    Merge branch 'master' of https://github.com/Jacksonary/LinuxCodeRepositor    提价本地的commit ec0a01079a093a2d3afd03cebcdf58a99c9b219aAuthor: jacksonary <jacksonary@163.com>

这里如果退出的话按q即可退出
这时如果要回退到某个版本可以复制上面的某个版本的commit的标识符,比如Wed Nov 29 19:08:51 2017 +0800的第一个版本,复制commit id为e0dfaa1b163cae0f69b0d3805224e6d6750e2623,然后执行

# git reset --hard commit的idgit reset --hard e0dfaa1b163cae0f69b0d3805224e6d6750e2623

即可回退到指定版本,这里的版本回退是指本地仓库的代码回退到之前的版本,hader其实就是当前指针。

2.前进
在回退后,发现版本不对,应该回退到相对于当前版本的未来版本(即以前的推送版本从最早到最晚依次为:1,2,3,4,后来回退到版本2,但是会到2后,又想回到3),这时候可以用执行git log只能查看2版本之前的log,而不能查看到3、4版本的log,所以此时必须用如下的命令

git reflog

才能擦还看到整个log,这时会出现如下的一些信息
简单提一下git log和git reflog的区别:
显示整个本地仓储的commit, 包括所有branch的commit, 甚至包括已经撤销的commit, 只要HEAD发生了变化, 就会在reflog里面看得到. git log只包括当前分支的commit.

f40e8a6 HEAD@{0}: reset: moving to f40e8a6b3c72447582f019dcf1e21310a941f00c9d04cb3 HEAD@{1}: commit: 只剩首行f40e8a6 HEAD@{2}: commit: 删除更目录下的文件f9e8658 HEAD@{3}: commit: 移动log2到test文件夹下be82917 HEAD@{4}: pull: Merge made by the 'recursive' strategy.7204553 HEAD@{5}: commit: CentOS7 add190957f5 HEAD@{6}: reset: moving to 90957f590ef6013cad08fd4deca46b4975c3099be0dfaa1 HEAD@{7}: commit (merge): Merge branch 'master' of github.com:Jacksonary/LinuxCodeReposiaa46c2f HEAD@{8}: commit: CentOS7 commit5c35f62 HEAD@{9}: pull: Fast-forwardf3bef4c HEAD@{10}: commit (merge): Merge branch 'master' of github.com:Jacksonary/LinuxCodeReposb97c221 HEAD@{11}: commit: local updatec27b62e HEAD@{12}: commit: first commit by weiguoLiu4952fee HEAD@{13}: commit: 删除龙猫的test文件夹90957f5 HEAD@{14}: commit (initial): 刘维国首次提交测试文件test

然后指定回当前版本的之后的某个版本,比如:

git reset --hard 9d04cb3

9.删除根目录下的某个文件

比如仓库更目录下有一个log2的文件,现在要删除,但是删除的时候就没法利用add指令来追踪状态(会提示找不到这个文件),这个时候可以这样

# 删除log2文件rm -rf log2# 追踪所在仓库的整个状态git add -A# 提交本地仓库git commit# 推送到远程仓库,删除远程仓库中根目录下的log2git push

10.里程碑的创建(Release)

在github网站上,进入仓库根目录,点击上方的“release”的标签,如果是首次创建release,那么点击页面中间的create new release即可创建一个release,如果不是首次创建,那么点击右上角的“Draft a new release”标签来创建新的release,填写如下的信息然后publish即可
填写release信息
发布后就可以得到如下的页面,其他用户可以通过这里下载压缩文件
压缩文件

11.分支

有这样一个场景:已经Publish出去的Release有人反馈有bug,我们需要立刻进行修复,但是此时默认的分支master已经推送了新功能个的代码,所以不能在master分支上进行立刻发布(因为新功能的代码还没测试,这时候发不出去可能会带来严重问题),这时候就需要在已经发布的那个版本的基础上进行bug的修复,在修复后再将这种修复同步到master分支上,这样就可以在不影响当前发开的前提下解决bug。
1.创建分支并更新
在windows中的github客户端上如下操作创建分支
客户端创建分支
然后当前就会自动切换到创建的分支上(比如创建了一个叫做bug的分支),这时候照常更新代码,然后推送就会推送到bug分支上,而master分支上的代码将不会发生任何修改。

2.合并分支
比如master分支上的代码完成测试了,但是由于以前的bug是在bug分支上进行修复的,而master分支上没有进行任何修复,所以以前的bug任何存在,这个时候需要将bug分之后已经没有bug的代码合并进入master分支上。切换到master分支,点击上方菜单栏的Branch–>Merge into current branch…然后选中bug分支–>Merge into master即可合并bug修复内容到master分支的代码上(这种方式合并时会提示有冲突);或者也可以进入github的网站进入仓库根目录,会有这个东西
这里写图片描述
点击Compare & pull request进行比较,然后点击Create pull request,最后点击Merge pull request即可合并(这种方式不会有冲突)。

3.Linux下的分支
如果存在多个分支也应该要进行分支的切换
【注意】如果一个分支更新后没有commit是无法进行切换的,会警告ambiguous

# 进入clone下来的项目根目录cd xxx# 创建并切换到web-1分支git checkout -b web-1上述的指令是两个指令的合并1. 创建分支 git branch web-12. 切换到web-1分支 git checkout web-1# 查看当前项目的分支情况git branch

在Eclipse中可以通过Team–>Switch to查看分支情况,切换哪个点哪个,很方便

12.实际开发中的经验

1.每次代码提交前,最好diff一下自己的代码

2.产品发布后,记得打一个tag,方便将来拉回分支修复bug

原创粉丝点击