Git使用笔记

Posted by izumo on December 18, 2016

1 Git安装

Windows

去Git官网下载,地址:https://git-scm.com/

Linux

Debian下,输入命令:

apt-get install git

2 Git初始化

配置信息

git config --global user.name "<your_name>"

git config --global user.email "<your_email>"

Git仓库初始化

在目标文件夹下,输入命令:

git init

3 Git基本使用

添加文件

git add <file_name>

注:在windows下,不要使用记事本等带有Bom UTF-8的软件编写代码。

添加所有文件(除了gitignore里的文件)

git add .

提交

git commit -m "<commit_message>"

仅提交add之前的内容。

查看当前仓库状态

git status

比较某个文件与仓库里文件的不同

git diff <file_name>

查看仓库提交历史记录

git log

查看仓库命令历史

git reflog

commit后面跟的数字为<commit_id>

回退版本

回退1个版本

git reset --hard HEAD^

回退N个版本

gir reset --hard HEAD^^^

HAED后跟着N个^

回退到指定版本

git reset --hard <commit_id>

可以前向回退

撤销修改

还未add时

git checkout -- <file_name>

已经add,还未commit时

git reset HEAD <file_name>

已经commit时

查看“回退版本”章节

删除版本库的文件

git rm <file_name>
git commit -m "<commit_message>"

4 GitHub使用

使用前的准备

获得本地RSA公钥

ssh-keygen -t rsa -C "<your_email>"

.ssh文件夹内的rsa.pub文件夹里的公钥添加到GitHub中。

复制本地内容到GitHub

首先在GitHub上新建一个空仓库,命名<your_repository_name>

添加关联

git remote add origin git@github.com:<your_github_name>/<your_repository_name>.git

第一次推送

git push -u origin master

非第一次推送

git push origin master

查看远程库信息

git remote -v

复制GitHub内容到本地

第一次

git clone git@github.com:<your_github_name>/<your_repository_name>.git

非第一次

git pull

复制远程仓库分支到本地

第一次

创建

git checkout -b <branch_name> origin/<branch_name>

或者复制

git branch --set-upstream <branch_name> origin/<branch_name> #已过时?
git branch --set-upstream-to=origin/<branch_name>
git pull

非第一次

git pull

复制本地分支到远程仓库

git push origin <branch_name>

5 分支管理

创建并切换分支

git checkout -b <branch_name>

查看分支

git branch

切换分支

git checkout <branch_name>

合并目标分支到本分支

git merge <target_branch_name>

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

git merge --no-ff -m "<commit_message>" <branch_name>

删除分支

git branch -d <branch_name>

查看分支合并图

git log --graph --pretty=oneline --abbrev-commit

6 Git服务器

准备

收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/<user_name>/.ssh/authorized_keys文件里,一行一个。

创建Git仓库

git init --bare <ropesitory_name>.git

将远程仓库复制到本地

git clone <user_name>@<server>:<relative_path> #相对路径,相当于/home/<user_name>/<relative_path>
git clone <user_name>@<server>:/<absolute_path> #绝对路径,相当于<absolute_path>

其余操作参考之前章节

7 其他

在两台电脑间传送内容

可以通过git clone来复制对方内容,但修改后通过git push推送给对方则会失败,会出现以下信息:

remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable t
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing int
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in som
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, se
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.

其实仔细想一想,不能直接推送是正常的,别人正在编写代码,你直接git push把别人的代码给修改了,别人一定会一脸懵逼。解决方法有以下几种:

  1. 通过git init --bare新建一个空仓库,双方都通过这个仓库同步内容。

  2. 将内容推送到对方的非checkout分支。

8 参考资料

  1. 廖雪峰的官方网站——Git教程

  2. 孙宏明. 完全学会Git, GitHub, GitServer的24堂课[M]. 清华大学出版社, 2016.