我的需求
2017年1月11日14:35:59
git使用的时间有两年了,简单的操作没有问题,实际上对它的了解极为有限。因为工作时候一旦操作变得频繁、流程化之后便会懒得去深入学习,所以当前对于git的掌握范围会限制于特定的时空当中:特定的工作流程下特定的几步操作。
这周任务的开头需要从fork的原始仓库里面获取存放有天气数据的文件,如果将当前脑子里面存放的工作上这一套搬移过去,那么将是这样子的:
- get fetch 将原始仓库当中的最新版本抓取到本地。
- get rebase 将本地同步到原始仓库当中最新的版本。
看起来如此宏大的操作,实际上不能够满足我的需求。我的需求很简单:
- “指哪儿打哪儿”而不是“眉毛胡子一把抓”:只需要拿到特定的一个文件。
- “红杏出墙看世界”:除了日常使用的git fetch/get rebase外,我还想知道git pull/git merge等等的操作。
从“链接汇总”里面找到第0周的参考链接,决定较系统的学习下git操作,从中选择廖雪峰的 Git 教程阅读。
git学习
2017年1月11日14:58:19
几个主要的git命令:
git init 初始化git仓库,只有初始化之后才能够正常使用git进行仓库管理。
git add 在对仓库里面文件进行增/删/查/改之后的确认操作。
git commit 确认最终的修改,在多次git add之后,使用git commit确认完成本次修改。如果git add是往书包里面装东西的话,git commit相当于在把各种瓶瓶罐罐装到书包之后拉上书包拉链并背到背上的操作。
git status 查看当前仓库的状态,会罗列出当前目录下所有的改动。
git diff 查看差异,可以对比working tree、branch、commit,我使用过的是检查某个文件的修改。
git log 查看提交日志。使用
git log --graph --pretty=oneline --abbrev-commit可以查看提交的时间线,多分支操作时挺有用。git reset “切换版本”。理解不深,请允许我当前这么称呼它。该命令一般在进行回退操作的时候使用,适用于回退某些未保存的修改或者某些commit。需要记住HEAD表示当前版本,HEAD^表示前一次commit对应的版本,HEAD~100表示100次前commit的版本。同时注意"--hard"参数的使用。
git checkout 该命令可以用来切换/创建分支(git checkout
),或者撤销修改(git checkout -- ) git push 使用git push来将本地的修改推送到远端仓库。
git branch 查看/创建分支。当前分支前方有
*标识。
上面这几个命令日常工作当中会使用到,而接下来的这几个命令就没有用过了,而它们也是这周任务当中所需要使用到的技能。
git remote -v 查看远端的仓库。如果当前本地仓库是之前使用git clone从远端克隆过来的,那么使用该命令查看时会有对应的信息。如果本地仓库是自己创建的,那么使用git remote -v查看到的内容为空。下一步你需要使用git remote add来添加远端关联仓库。
git remote add 添加远端仓库。一般对应两种情况:①如果当前仓库是通过git init生成并且需要与远端仓库关联起来。②当前已经关联过远端仓库,但是依然想从更多的远端仓库获取数据。所以可以知道,本地仓库是可以和多个远端仓库关联起来的。
get merge
多branch开发的时候通过该命令来将branch_another与本分支合并。 get pull 这个命令分解下来有三个步骤:①查找与本地仓库当前分支关联的远端仓库分支,如果分支没有关联起来使用
git branch --set-upstream <local_branch_name> origin/remote_branch_name>进行关联;②从远端仓库将分支对应的修改抓取到本地;③自动合并,如果有冲突就先解决再提交。
学习到这里,可以猜测将其他仓库的天气数据文件获取到本地的操作有:
- 使用git remote add 将本地仓库与其他仓库进行关联。
- 使用git pull命令将其他仓库的文件抓取下来。
稍后尝试下。
注:
1. 对于git add/git commit的具体解释可以参考廖雪峰的这篇介绍
2. 使用git clone的时候使用的地址可以有多个,原因是git支持多种协议,如https, git,每种协议可以有对应的地址。
*3. @shippomiru推荐了一篇阮一峰的git教程,很不错。
谋定,后动
2017年1月12日17:31:43
因为留意到git fetch 和git pull都有从远端抓取数据的能力,特意搜索了它们之间的差别,这里有篇文章讲得挺清晰。对于这两条命令主要有:
- git pull的命令相当于 git fetch + git merge。
- git fetch会将远端所有的分支抓取下来。
- git merge会从远端的分支当中选择与本地对应的分支进行合并。
对于如上“对应分支”,也就是本地与远端关联起来的分支。通过cat .git/config来查看本地分支的关联情况,比如我当前仅仅通过git clone克隆过github上的Py103仓库,并通过git push命令将本地的修改推送到远端,这个时候本地的master分支与远端的origin关联起来了。
> cat .git/config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = https://github.com/tcfh2016/Py103.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[user]
name = tcfh2016
email = tcfh2016@gmail.com
1. 添加远程仓库
通过git remote add远端仓库之后可以查看到:
lianbche@5CG44636XG D:\Learning\git\Py103
> git remote add AIMinder https://github.com/AIMinder/Py103.git
lianbche@5CG44636XG D:\Learning\git\Py103
> git remote -v
AIMinder https://github.com/AIMinder/Py103.git (fetch)
AIMinder https://github.com/AIMinder/Py103.git (push)
origin https://github.com/tcfh2016/Py103.git (fetch)
origin https://github.com/tcfh2016/Py103.git (push)
查看.git/config,发现多了一行[remote "AIMinder"]的内容,目前本地还没有分支与"AIMinder"关联,所以在接下来并没有[branch " "]的内容。
lianbche@5CG44636XG D:\Learning\git\Py103
> cat .git/config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = https://github.com/tcfh2016/Py103.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[user]
name = tcfh2016
email = tcfh2016@gmail.com
[remote "AIMinder"]
url = https://github.com/AIMinder/Py103.git
fetch = +refs/heads/*:refs/remotes/AIMinder/*
lianbche@5CG44636XG D:\Learning\git\Py103
2. 从新增远程仓库中获取数据
2017年1月12日20:56:30
如上添加远程仓库AIMinder之后,分支情况如下:
lianbche@5CG44636XG D:\Learning\git\Py103
> git branch -r
origin/HEAD -> origin/master
origin/master
lianbche@5CG44636XG D:\Learning\git\Py103
> git branch
* master
lianbche@5CG44636XG D:\Learning\git\Py103
>
使用git branch -r查看远端分支,使用git branch查看本地分支。可见,当前还没有远端仓库对应的分支,这个时候需要执行git fetch命令来从远端仓库拉取数据,而这个时候也会同时在本地创建该远端仓库对应的远端分支:
lianbche@5CG44636XG D:\Learning\git\Py103
> git fetch AIMinder
From https://github.com/AIMinder/Py103
* [new branch] master -> AIMinder/master
lianbche@5CG44636XG D:\Learning\git\Py103
> git branch -r
AIMinder/master
origin/HEAD -> origin/master
origin/master
lianbche@5CG44636XG D:\Learning\git\Py103
> git branch
* master
lianbche@5CG44636XG D:\Learning\git\Py103
如上,已经创建的远端分支是AIMinder/master。这上面携带有AIMinder仓库最新的修改。
3. 其实我只想要一个文件
2017年1月12日21:15:40
按照之前所说,在执行git fetch之后下一步便是执行git merge来合并分支,不过问题来了:我当前分支已经修改得比较多了,而课程当中的AIMinder/Py103仓库尽管改动比较少,但在我fork之后也有一些修改,我可以直接进行git merge吗?
不做merge操作我就没有办法取到AIMinder/Py103/Chap1/project下面的weather_info.txt文件,进行merge将可能导致冲突,而一想到冲突,麻烦、不耐烦、恐惧扑面而来。有过前一次设置gitbook评论区的经验之后,犹豫之后终于敲下了git merge AIMinder/master:
lianbche@5CG44636XG D:\Learning\git\Py103
> git merge AIMinder/master
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
lianbche@5CG44636XG D:\Learning\git\Py103
> git status -s
A .gitignore
A Chap1/project/weather_info.txt
UU README.md
确实有冲突,不过仅仅限于README.md文件。另外可以看到的新增修改是两个文件:.gitignore与weather_info.txt,后面这个文件就是我需要的。
接下来的工作便是清扫:除了保留weather_info.txt之外,撤销对另外两个文件的修改:
第一步:撤销远端分支上针对README.md的新增修改,标记由UU更新为M。
lianbche@5CG44636XG D:\Learning\git\Py103
> git reset README.md
Unstaged changes after reset:
M README.md
第二步:撤销远端分支上针对.gitignore文件的新增修改,因为这个文件是新增加的,所以状态有标记由A更新为??,表示已经不在git的管辖范围了。
lianbche@5CG44636XG D:\Learning\git\Py103
> git reset .gitignore
Unstaged changes after reset:
M README.md
lianbche@5CG44636XG D:\Learning\git\Py103
> git status -s
A Chap1/project/weather_info.txt
M README.md
?? .gitignore
第三步:上一步git reset仅仅是解锁了新增的修改,表示这部分修改git脱管,但修改依然在本地文件当中,要彻底将这部分修改清除掉,使之恢复到上一次commit的状态就需要使用check out。
lianbche@5CG44636XG D:\Learning\git\Py103
> git checkout README.md
第四步:之后查看,仅仅还剩下新增加的weather_info.txt文件了,这部分我们需要保留,因此将其commit,并push到我自己的远端仓库tcfh2016/Py103。
lianbche@5CG44636XG D:\Learning\git\Py103
> git status -s
A Chap1/project/weather_info.txt
?? .gitignore
lianbche@5CG44636XG D:\Learning\git\Py103
> git commit -m "Add weather_info.txt"
[master 65280b6] Add weather_info.txt
lianbche@5CG44636XG D:\Learning\git\Py103
> git push origin master
Counting objects: 17, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (17/17), done.
Writing objects: 100% (17/17), 16.93 KiB | 0 bytes/s, done.
Total 17 (delta 8), reused 0 (delta 0)
remote: Resolving deltas: 100% (8/8), completed with 5 local objects.
To https://github.com/tcfh2016/Py103.git
667785c..65280b6 master -> master
lianbche@5CG44636XG D:\Learning\git\Py103
第五步:删掉不用的.gitignore,世界清净了。
lianbche@5CG44636XG D:\Learning\git\Py103
> rm .gitignore
这样我就将weather_info.txt文件加入到我自己的仓库当中了。子任务完成。