参考资料
安装配置
Git服务器配置
# 安装Git
$ yum install git
# 创建用户,并修改shell类型。
$ useradd git
$vim /etc/passwd
# 修改git用户的默认登录shell`/bin/bash`为`/usr/bin/git-shell`
# 创建认证密钥
$ cd /home/git/.ssh
$ touch authorized_keys
# 初始化Git仓库
$ mkdir /opt/git
$ cd /opt/git
$ git init --bare test.git
$ chown git:git test.git
Git客户端配置
- 通过证书的方式配置服务器,首先生成证书(建议输入密码),证书生成后位于
~/.ssh
中id_rsa
和id_rsa.pub
。
$ ssh-keygen rsa
- 将证书的公钥文件
~/.ssh/id_rsa.pub
的内容复制到服务器/home/git/.ssh/authorized_keys
文件结尾。 - 克隆远程仓库
$ git clone git@hostname.com:22/opt/git/test.git
注意:若远程SSH登录不要密码,authorized_keys
不生效的解决方法。
-
.ssh
目录的权限必须为077 -
.ssh/authorized_keys
文件权限必须为600
操作命令
切换远程分支从master
到dev
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
# 切到远程的dev分支,在本地起名为dev分支,并切换到本地的dev分支。
$ git checkout -b dev origin/dev
$ git branch -a
* dev
master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
列出在配置文件中设置的所有变量及其值
$ git config -l
$ git config --list
查看远程仓库命令
$ git remote -v
错误处理
fatal: could not create work tree dir xxx : Permission denied
错误发生:git clone
时出现
错误原因:正在写入或克隆的git仓库的目录没有写入的权限
error: Your local changes to the following files would be overwritten by merge:
Please commit your changes or stash them before you merge.
错误原因:当前分支有未跟踪的文件或新修改的代码的文件,将会被git服务器上的代码覆盖。
解决方案:
# 服务器代码合并本地代码
# 暂存当前正在进行的工作
$ git stash
# 拉取服务器的代码
$ git pull origin master
# 合并暂存的代码
$ git stash pop
# 服务器代码覆盖本地代码
# 回滚到上一个版本
$ git reset --hard
$ git pull origin master
错误处理
$ git push
fatal: No configured push destination.
Either specify the URL from the command-line or configure a remote repository using
git remote add <name> <url>
and then push using the remote name
git push <name>
本地仓库未配置与远程仓库之间的联系
$ git add --all
$ git commit -m "commit info"
$ git remote add orgin "https://xxxx.com"
$ git push -u origin master
错误错误
使用git clone
远程项目时出现fatal: repository 'http://xxx.git/' not found
错误
[root@TH-DEV ~]# git clone http://xxx.git
Cloning into 'xxx'...
fatal: repository 'xxx' not found
错误原因是本地已经存储GIT账号密码与拉取仓库所属的账号密码不同,解决的方式是拉取地址中添加上对应账户和密码。
在使用git clone 命令的时候我们可以将用户名和密码嵌入到链接,每次更新都无需输入账户和密码。
git clone http://userName:password@链接
git clone https://username:password@git.oschina.net/wdm/familycloud.git
如果账户或密码中存在@
符号需将其URLENCODE
编码为%40
后执行
Nginx错误
Starting php-fpm [10-May-2020 14:04:29] ERROR: An another FPM instance seems to already listen on /tmp/php-cgi.sock
[10-May-2020 14:04:29] ERROR: FPM initialization failed
failed
[root@TH-DEV vhost]# nginx -s reload
nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"
$ nginx -c /usr/local/nginx/conf/nginx.conf
删除文件
由于项目第一次提交时没有创建.gitignore
文件并配置无需提交的文件夹,结果将IDE的隐藏的配置文件夹上传了,每次在不同机器上使用相同IDE拉取和推送文件时就会出现错误提示。
error: Your local changes to the following files would be overwritten by merge:
.idea/workspace.xml
Please commit your changes or stash them before you can merge.
Aborting
此时,需要将已经提交的文件给删除掉。
$ git rm -h
语法
$ git rm [<选项>] [--] <文件>...
选项 | 全程 | 描述 |
---|---|---|
-n | --dry-run | 演习 |
-q | --quiet | 不列出删除的文件 |
- | --cached | 只从索引区删除 |
-f | --force | 忽略文件更新状态检查 |
-r | - | 允许递归删除 |
- | --ignore-unmatch | 即使没有匹配也以零状态退出 |
使用git rm
将会同时从工作区和索引中删除文件,也就是说本地文件也会被删除掉。而使用git rm --cached
只会从索引中删除文件,本地文件依然存在,也就是只是不希望这个文件被版本控制。
例如:删除本地仓库中提交的.idea
文件夹
$ git rm --cached -r .idea
删除文件后可查看文件修改的状态
$ git status
git rm
只是删除工作区的文件并没有删除版本库中的文件,若要删除版本库需要执行提交。
$ git add . && git commit -m "delete .idea"
此时拉取出现错误
$ git pull
error: Pull is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.
将本地冲突文件解决
$ git reset --hard
拉取在此出现问题
$ git pull
CONFLICT (modify/delete): .idea/workspace.xml deleted in HEAD and modified in a06b889a63b2d0f71796eeaee4333e1d65a0ea72. Version a06b889a63b2d0f71796eeaee4333e1d65a0ea72 of .idea/workspa
ce.xml left in tree.
CONFLICT (modify/delete): .idea/codeStyles/Project.xml deleted in HEAD and modified in a06b889a63b2d0f71796eeaee4333e1d65a0ea72. Version a06b889a63b2d0f71796eeaee4333e1d65a0ea72 of .ide
a/codeStyles/Project.xml left in tree.
Automatic merge failed; fix conflicts and then commit the result.
远程版本库中.idea
文件夹并未被删除掉,因为只是提交到本地仓库并未推送到远程仓库。
$ git push
此时观察远程仓库中的.idea
文件夹仍然没有被删除
$ git pull
此时拉取远程仓库并没发现错误
拉取错误git pull
$ git pull
error: Pulling is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.
- 错误:无法拉取因为有未合并的文件
- 提示:使用
git add/rm <file>
命令在工作树内修复 - 提示:根据需要标记解决方案并提交
- 致命错误:由于未解决冲突而退出
错误原因
local
本地文件冲突了,因为git pull
会使用git merge
因此导致冲突,git merge
会形成MERGE-HEAD(FETCH-HEAD)
引用,而git push
会形成HEAD
引用,HEAD
代表本地最近成功git push
后形成的引用。
因此需要将冲突的文件resolve
解决掉git add -u
和git commit
之后才能成功git pull
。
如果可以放弃本地文件的修改,也可以将修改的文件提出来保存后,使用git reset --hard FETCH_HEAD
,其中FETCH_HEAD
表示上一次成功git pull
之后形成的commit
提交点,然后在git pull
。
查看当前状态
$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
当前分支与origin/master
远程主分支存在分歧,有1个和1个不同的commit
提交。
提交本地代码并获取远程仓库dev
分支最新代码
$ git add . && git commit -m "update" && git pull origin dev
在git pull
提交时如果存在冲突,那么除了冲突的文件之外,其它文件都会作为staged
暂存区的文件保存起来。由于本地的push
和merge
会形成MERGE-HEAD(FETCH-HEAD)
和HEAD(PUSH-HEAD)
这种引用。
-
HEAD
代表本地成功push
后形成的引用 -
MERGE-HEAD
表示成功pull
后形成的引用
如果需要将本地的冲突文件冲掉,不仅需要reset
到MERGE-HEAD
或HEAD
,还需--hard
,否则会冲掉本地工作区。添加--hard
只会冲掉stage
暂存区。但问题最新的代码也会被冲掉。
$ git reset --hard FETCH_HEAD
GIT克隆
GIT克隆项目分支并重命名
$ git clone -b dev http://git.duduworks.com/zhoujun/sxyh.git sxyh_dev