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
把别人的代码给修改了,别人一定会一脸懵逼。解决方法有以下几种:
-
通过
git init --bare
新建一个空仓库,双方都通过这个仓库同步内容。 -
将内容推送到对方的非checkout分支。
8 参考资料
-
孙宏明. 完全学会Git, GitHub, GitServer的24堂课[M]. 清华大学出版社, 2016.