git的使用

用GitHub必然要用到git这个工具。之前对于git的使用仅仅局限于最常规的操作。
先简单记录已会的基本操作,接下来根据git官网上的教程廖雪峰的git教程。详细了解和整理下git的原理和更多操作方法。

基础用法

新建本地仓库

1
2
3
4
5
git init
git add .
git commit -m "first commit"
git remote add origin https://github.com/breezepqf/script.git(输入自己的GitHub远程仓库链接)
git push -u origin master

获取远程仓库最新信息

1
2
3
4
git fetch origin master:temp //从远程获取最新版本到本地,并建立一个temp分支
git diff //比较temp和master两个分支的不同
git merge temp //合并temp分支到本地的master分支
git branch -d temp//删除temp分支

修改当前仓库的远程地址

1
git remote set-url origin remote_git_address

这个操作适用于clone了一个项目,但当时没有fork,后来直接在clone的文件夹下改动了,并且想把这些改动记录下来。那么先去fork下原项目,然后再把自己fork下来的仓库地址替换上面命令中的remote_git_address

fork的项目更新

fork另外一个作者的项目之后可能我们已经作出了修改。很多情况下我们会想要保留现在我们本地仓库的修改的同时把原作者添加的内容增加到本地仓库。

1.git remote add origin-writer 这里加原作者项目的GitHub链接

可以用git remote -v查看远程分支,这时候有两个分支 一个是origin 还有一个就是我们命名的origin-writer(这个命名自然随意)

(用完之后想要删除,git remote remove <name>)

2.git fetch origin-writer把原项目更新的内容fetch到本地

3.git branch -av 查看本地仓库分支

4.git checkout master 切换到master分支,当然如果已经在master分支上则不用切换

5.git merge origin-writer/master 合并分支

6.如果有冲突的话,可以自行考虑是用 —hard 还是 —soft。区别如下:

git reset --hard origin-writer/master回退一个版本,清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换

git reset --soft origin-writer/master回退一个版本,不清空暂存区,将已提交的内容恢复到暂存区,不影响原来本地的文件(未提交的也不受影响)

7.之后就是正常的把本地仓库更新到远程仓库

1
2
3
git commit -am ‘更新到原作者的主分支’
git push origin
git push -u origin master -f –强制提交

命令git commit -am '版本说明' 里的-am 包含 git add。这里还涉及到git工作模式的区别,tracked和untracked 已跟踪和未跟踪,git只会去记录已跟踪文件的变化。第一次新建本地仓库和远程仓库链接时候,git add .代表初始已经在文件夹中的文件都变成已跟踪模式。如果之后新建了一个test.txt文件,那么需要git add test.txt把这个文件变成已跟踪才能进行commit操作。commit操作需要分清楚工作区和暂存区之间的区别。在你commit之前,你所有最新的修改操作都只是在工作区,只有经过commit才会被存储进暂存区,也就是git帮你记录不同版本和每个版本修改了什么的地方,也可以说是.git文件夹。

更多细节

下面逐步按照教程,逐步整理。

查看类型的指令

1
2
3
git status
git diff a.txt
git log

版本回退

Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^,上上一个版本就是HEAD^^

如果回退到过去版本后悔了,想要重新复原之前的版本。用git reflog查看你输入的git指令历史,查看原来的版本的版本号,再git reset --hard 版本号

放弃新的修改

1.如果想放弃对工作区的修改,把工作区还原到上次commit时候的状态

例如git checkout -- readme.txt就可以达到目的,其实是用版本库里的版本替换工作区的版本。

记得加--不然就是切换branch的操作了。

2.如果想改动了一些,也git add了,但并不想把这些改动commit并希望把暂存区也改回来

git reset HEAD <filename>git reset HEAD把暂存区改回上个commit时候的情况。

创建分支

创建分支

git checkout -b 分支名字

上述命令等于

git branch 分支名字 加上 git checkout 分支名字 创建加转移到新分支上

暂存工作区

本来在一个例如叫dev的branch上工作,突然需要去处理一个紧急bug,但是工作区此时是dev这个branch的,而且还没完成,没法提交。

使用git stash把现场隐藏起来,git checkout -b bug-01新创建一个修复bug的分支之后和master分支合并,最后删除。

切换到dev分支,git stash pop把刚刚隐藏的分支内容显现在工作区。

删除分支

创建了一个新的分支dev,想要删除,首先需要确保退出该分支,checkout回master分支git checkout master

之后 git branch -D dev

本地分支和远程分支的链接

master分支是默认自动链接的,那么对于dev分支呢,有时候想要git pull拉一个类似dev这种的子分支就需要完成链接。

git branch --set-upstream-to=origin/dev dev这样就可以pull下来了。

不过对于从本地push到远程,对于dev分支来讲GitHub会自动创建一个新的远程分支,操作前并不需要什么额外操作。

关于rebase

又叫变基操作,具体参考

只对尚未推送或分享给别人的本地修改执行变基操作清理历史;
从不对已推送至别处的提交执行变基操作

git命令速查表