Git
入门
Git是什么?
Git中译为混账,是Linus先生花了一个星期写的分布式版本控制系统(VCS,Version Control System),用于Linux内核的协同开发。所谓版本控制系统,个人理解就是可以保存文本文件的历史版本信息,并且可以回溯到某个历史版本的文本文件管理系统。它的设计就是为了方便软件开发的版本迭代和协同开发。
比如,你打开电脑的记事本,一个不小心把昨天写的备忘全给删除了,而且还习惯性地按了Ctrl+S,你懵了。一般情况下是找不回来了。除非有版本备份,现在有些云笔记类软件就提供了这样的功能。其实质就是版本控制,它可以让你回溯到某个历史版本,像是吃了后悔药一般美妙。
Git怎么玩?
配置Git环境
玩什么都有第一步,已经司空见惯了呃。没错就是配置环境。Git的环境配置还不算复杂:
-
下载Git并安装Git(注意:不懂英文的按默认配置就好);
-
向全世界宣称你的存在
//注意:--global表示你电脑里的所以Git仓库都采用相同的配置 //如果有不用用户的Git仓库,就去掉吧。 $ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
建个仓库放点东西
- 建库简单:在磁盘上新建个文件夹作为工作区,然后右击打开Git Bash,执行
git init
,你会发现多了个.git
文件夹。 - 放东西有点复杂
- 第一步:在工作区新建一个文件,命名为yuren.txt。注意:文本文件的编码是UTF-8 without BOM(使用Notepad++可以查看和修改)
- 第二步:
git add .
添加文件到暂存区 - 第三步:
git commit -m "add yuren.txt"
添加文件到本地仓库
历尽千辛万苦终于把文件交给Git来管理了。
时光机穿梭
假定你在上个步骤中放入的文件是:yuren.txt。里面的内容是(标记为v1):
[微信红包]恭喜发财,大吉大利!
是不是又冲进来了,这么激动干嘛,发几个文字而已~
后来,你想了想,改成了(标记为v2):
[微信红包]愚人节Happy!
是不是又冲进来了,这么激动干嘛,发几个文字而已~
根据【建个仓库放点东西】里说的步骤更新本地仓库中的信息:
$ git add .
$ git commit -m "update yuren.txt"
不知道哪根筋不对,你又想要v1版本的yuren.txt了,但是又忘了上一次写的内容,怎么办?
没关系,可以通过git log
查看每次的提交信息。
$ git log
commit 1ba454f3ef3e48b88b4c24f72dc8055407cd9019
Author: Your Name <email@example.com>
Date: Fri Apr 1 16:19:41 2016 +0800
update yuren.txt
commit ce58ee1a57d21c9d752e80b820b7f2968249ac2e
Author: Your Name <email@example.com>
Date: Fri Apr 1 16:17:35 2016 +0800
add yuren.text
回退到上一次commit,只需要执行
$ git reset --hard HEAD^
HEAD is now at ce58ee1 add yuren.text
这里,HEAD代表上一个版本,HEAD^代表上上个版本,HEAD~100代表上100个版本。当然可以使用具体的commit id来回退,比如上面的等价于$ git reset --hard ce58ee1
重新打开yuren.txt来看,v1版本的信息果然回来了。
人的心理真是捉摸不透,刚找回v1版本的信息了,就又怀念v2版本的信息了。然而,现在使用git log
都救不了你了。
$ git log
commit ce58ee1a57d21c9d752e80b820b7f2968249ac2e
Author: Lshare <linlshare@gmail.com>
Date: Fri Apr 1 16:17:35 2016 +0800
add yuren.text
v2版本的信息似乎丢失了。怎么办?
-
方法一:如果你还知道v2版本的commit id的话可以
$ git reset --hard <commit id>
来解决; -
方法二:假如你不知道也没关系,使用
git reflog
查看你的每次命令,接下来就可以用方法一解决了。$ git reflog ce58ee1 HEAD@{0}: reset: moving to HEAD^ 1ba454f HEAD@{1}: commit: update yuren.txt ce58ee1 HEAD@{2}: commit (initial): add yuren.text
进阶
本地记住密码
# Set git to use the credential memory cache
git config --global credential.helper cache
提交当前分支的更改到远程的同名分支
$ git push origin HEAD
删除远程分支
$ git push origin :dev-sth
# 相当于
$ git push origin --delete dev-sth
重命名分支
# 本地分支重命名
git branch -m dev-old dev-new
# 删除远程分支
$ git push origin :dev-old
# 推送到远程
git push origin dev-new:dev-new
撤销 git commit 但未 git push 的修改
#找到想要撤销的 commit id
$ git log
#撤销,但不对代码修改进行撤销,还可以再次 commit
$ git reset <commit id>
#撤销并忽略该次 commit 的代码修改
$ git reset --hard <commit id>
移除远程分支上的脏文件(clean remote files)
$ git rm -rf <file1> <file2>
添加子模块(submodule)
$ git submodule add git://github.com/chneukirchen/rack.git rack
重命名已有的分支
If you want to rename a branch while pointed to any branch, do:
git branch -m <oldname> <newname>
If you want to rename the current branch, you can do:
git branch -m <newname>
问题
Server does not allow request for unadvertised object
日志:
Cloning into '/home/ec2-user/pack_workspace/dts-plugin-abot_default_jenkinsDefault/dts-plugin-abot/dts/common/build'...
Cloning into '/home/ec2-user/pack_workspace/dts-plugin-abot_default_jenkinsDefault/dts-plugin-abot/dts/common/protocol'...
error: Server does not allow request for unadvertised object 9cfd865e2e275dd6cf375efd734bc7d6b17da49f
Fetched in submodule path 'dts/dts-plugin', but it did not contain 9cfd865e2e275dd6cf375efd734bc7d6b17da49f. Direct fetching of that commit failed.
Failed to recurse into submodule path 'dts'
原因:
子模块分支游离,需要
git pull
git checkout <your branch>
然后提交下即可。
记得确保解决完该问题后,合并到你的 master 分支上。