用git建立仓库服务——本地和GitHub
平台: Ubuntu 18.04
注意:git只能跟踪文本文件的改动,图片和视频等二进制文件的改动就难以跟踪了
1. 初始化git
1) 安装git
sudo apt install git
2)添加个人信息,个人用户名和邮箱地址,这样做commit等操作后可以有记录
git config --global user.name "用户名" git config --global user.email "电子邮箱"
** 若没有参数“--global”,则这个用户名和电子邮箱将只对当前仓库有效
一、本地仓库操作
2. 建立本地仓库服务器 ——参考
假定在本地建立仓库服务,相当于总仓库,子仓库放在“~/gitrepo/"目录下,当前仓库命名为demo.git(仓库服务器这里一般都是以.git结尾的文件夹)。
mkdir ~/gitrepo cd ~/gitrepo git init --bare demo.git # 初始化了一个叫demo的仓库,文件夹为demo.git/
# 输出为:Initialized empty Git repository in /home/username/gitrepo/demo.git/
3. 应用到项目和将项目添加到本地仓库服务器
1)假定已有项目名为project,在~/project/目录下,进入该目录。
git init
# 输出为:Initialized empty Git repository in /home/username/project/.git/
这里在当前目录下初始化了一个本地仓库(前面建立的是服务器仓库),相关仓库文件将放在 .git/ 目录下,.git/ 目录下的HEAD是指向master分支的指针。
将仓库服务器和git建立连接,方便后面通过git将项目添加到仓库中。
git remote add origin ssh://username@10.xx.xx.xx:/home/username/gitrepo/demo.git # 远端仓库名为origin,该命令只需执行一次
# 出现问题ssh: Could not resolve hostname 10.xx.0.11:: Name or service not known时,可以尝试用下面的添加方式 ——参考
git remote add origin username@10.xx.xx.xx:/path/to/repository # 亲测有效
# 对于Windows地址可以参考如下写法
git remote add win ssh://username@10.xx.xx.xx.xx:/d/gitrepo/demo.git # 也就是将Windows中的路径d:\gitrepo\demo.git用unix的表达方式表达为/d/gitrepo/demo.git ——参考
# windows这个的问题是无法push过去到win,具体原因未知
这里添加了一个远端的仓库,名为origin。由于这是本地仓库服务,所以用到ssh协议连接,username和10.xx.xx.xx是ssh连接用到的用户名和ip,后面跟着远端仓库地址。
2)下面对本地仓库做基本的修改,这些修改经过add后都将放在本地仓库(.git/)中。
git add . # 将当前目录下所有文件添加到本地仓库里 git commit -m "add all new files to the repository" # 添加commit,讲述这次对仓库做了什么操作
可以在项目目录创建文件 .gitignore,里面记录不需要提交到库里的文件,防止每次不必要的提示。内容如
bin/ *.jpg
!bin/exp # 忽略bin目录,但保留bin/exp目录
!bin/exp/* # 目的:保留bin/exp目录下面的文件,但由于exp目录未被指定保留,所以这一句是无效的
—— .gitignore编写方法 参考
3)如果确定这次修改是有效的,要把本地仓库的修改更新到服务器那里,用push
git push origin master # 将master分支的修改push到origin库,也就是demo.git
# 如果遇见错误 ssh: Could not resolve hostname xx.x.x.xx:: Name or service not known fatal: Could not read from remote repository. # 可以尝试重新添加远程仓库后再尝试 git remote add origin username@xx.x.x.x:/path/to/repository
4. 如果要在另一个地方使用该项目,可以用clone命令:
git clone ssh://username@10.xx.xx.xx:/home/username/gitrepo/demo.git
上面的命令将在本地创建一个demo文件夹,里面是仓库里的内容,也就是之前push的project里面的内容。
5. 常用的git命令
1)
git status # 查看当前目录中的修改,如果有修改过的文件或者不在库中的文件,将有提示,即显示有可提交的文件 ——参考
git diff file # 查看file和仓库中的版本相比做的修改
git add file # 把file添加到暂存区(stage)
git commit -m "comments" # 将暂存区的内容添加到仓库,-m后带的是一些备注【没有-m则会打开vim让添加备注】
git commit -am "comments" # 省去git add,直接提交所有追踪到修改过的文件到仓库,并添加备注【无法添加新建的文件,需要用git add】
git clean # 删除所有未跟踪的文件
git push repo brench # 把分支brench的本地修改更新到repo
git pull repo brench # 从远程仓库repo更新到本地brench
git log # 查看最近三次的提交历史记录,会有每次提交的commit hash、作者、时间、备注内容等
git remote [-v] # 查看远程仓库有哪些,加 -v 参数将增加显示详细信息——远程仓库的地址
删除文件后(rm a.txt),要commit一下才能使仓库中对应文件也删除——commit就是更新库的状态和内容
** 问题:error: The following untracked working tree files would be overwritten by merge ——原因:本地仓库的内容不是从服务器仓库拉取的,源头不同,再从服务器拉取内容时,会发生冲突
解决:git pull强制覆盖本地的修改 或 先clone再pull(不实际) 或 先把本地版本移到其它地方
git fetch origin / --all # 只拉取到本地库,不会有其它操作, --all会拉取所有remote库,谨慎操作 git reset --hard origin/master # 将hard指向 origin的master分支,而不是原来的本地master分支,相当于强制覆盖 git pull origin master
更多参考——详细参考
2)版本回退
git reset --hard HEAD^ # 回退到上一版 git reset --hard HEAD^^ # 回退到上上版
git reset --hard HEAD~50 # 回退到前第50版
若又要恢复到最新版
git reflog # 查看版本号和commit备注
git reset --hard xxxx # xxxx是7位的版本号,也是commit hash的前7位
git checkout -- file # 撤销对file的修改,让file回到和版本库中的一样的状态
3)分支操作
git branch # 查看所有分支,当前分支是带*的 git branch dev # 创建dev分支
git branch -d dev # 删除dev分支 git checkout dev # 切换到dev分支 git checkout -b dev # 创建并切换到dev分支
git merge dev # 将dev合并到当前分支上,如果合并文件产生了冲突(两个分支对同一个文件做了不同修改),要先解决冲突
4)若文件名有中文,用git pull 拉取时,可能仅显示GBK码(如/204),而不显示中文
解决: 执行下面的命令 ——参考博客
git config --global core.quotepath false
二. 连接到GitHub仓库
博客参考