centos7下git服务器端搭建
git --version yum remove git
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum install gcc perl-ExtUtils-MakeMaker
cd /usr/local
mkdir git
cd git
wget https://github.com/git/git/archive/v2.9.2.tar.gz
tar -xzvf v2.9.2.tar.gz
分别执行以下命令进行编译安装,编译过程可能比较漫长,请耐心等待完成。
cd git-2.9.2
make prefix=/usr/local/git all
make prefix=/usr/local/git install
vi /etc/profile,在最后添加:
export PATH="/usr/local/git/bin:$PATH"
source /etc/profile
git --version
[root@localhost code]$ ln -s /usr/local/git/bin/git-upload-pack /usr/bin/git-upload-pack
[root@localhost code]$ ln -s /usr/local/git/bin/git-receive-pack /usr/bin/git-receive-pack
$ groupadd git
$ useradd git -g git
$ passwd git #参数是用户名
1.RSAAuthentication yes
2.PubkeyAuthentication yes
3.AuthorizedKeysFile .ssh/authorized_keys
cd /home/git mkdir gitrepos/test.git cd test.git git init --bare --shared
git clone test.git test 完成后在test中能看到 .git目录,可进行编辑文件,提交等测试
git clone git@192.168.0.41:/home/git/gitrepos/test.git test.git 其中:192.168.0.41 j git服务的IP,如果有域名也可以用. /home/git/gitrepos/test.git 是 git仓库的位置,注意 全路径. test.git 则是目的目录. 注意:如果公钥设置了密码,则需要输入该密码
Git--将已有的项目添加到git并推送到远程仓库中
把本地已经存在的项目,推送到github服务端,实现共享。
cd /home/git/gitrepos/ mkdir test.git cd test.git git init --bare --shared
cd uaopWeb git init
git add -A git commit
git add remote git@192.168.0.41:/home/git/gitrepos/test.git git push -u origin master
做完上面三个步骤之后,就实现了将本地代码同步到github的功能,接下来要做的事情就是继续修改代码,然后提交并推送到github
如果是多人协作开发的话,一定要先 pull ,将 github 的代码拉取到本地,这样在 merge 解决冲突的时候稍微简便些。默认拉取到 master分支(如果只是自己做这个项目,可以忽略pull)
将代码推送到 github , 默认推送到 别名为 origin 的仓库中的 master 分支上。
如果有多个远程仓库 或者 多个分支, 并且需要将代码推送到指定仓库的指定分支上,那么在 pull 或者 push 的时候,就需要 按照下面的格式书写:
git pull 仓库别名 仓库分支名 git push 仓库别名 仓库分支名
$ git log
$ git config --list
$ git add <file1> <file2>...
#添加所有修改的和新添加的
$ git add .
另一种写法
$ git add -A
$ git reset HEAD
$ git commit -m <message>
$ git commit <file1> <file2> -m <message>
缘由:当我们导入一个git项目时,开发环境会改变里面的一些配置,当我们修改完代码后,add,commit操作后,系统更改的配置信息,并不想去提交,这个时候就会用到这个配置,配置完成后,才更好的去add .和commit -m去操作。
要在Git BashHere这里面操作 $ touch .gitignore
#1.安装: $ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz
tar -zxf git-2.9.5.tar.gz
cd git-2.9.5
make prefix=/usr/local all
cc error
在linux系统上对redis源码进行编译时提示提示“make cc Command not found,make: * [adlist.o] Error 127”。这是由于系统没有安装gcc环境,因此在进行编译时才会出现上面提示,当安装好gcc后再进行编译时,上面错误提示将消失
解决:yum install gcc
perl Makefile.PL 出现Can't locate ExtUtils/MakeMaker.pm
解决: yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker cpan
make prefix=/usr/local install
yum install git-core
在 Windows 上安装 Git 同样轻松,有个叫做 msysGit 的项目提供了安装包,可以到 GitHub 的页面上下载 exe 安装文件并运行: http://msysgit.github.com/
git --version
检查当前文件状态
要确定哪些文件当前处于什么状态,可以用 git status 命令。如果在克隆仓库之后立即执行此命令,会看到类似这样的输出: $ git status
git remote -v 显示所有远程信息 #7.server搭建 1.创建git用户 useradd git ,passwd git 2.禁用git用户shell登录 #8.第三步,创建证书登录: 收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。 #9.客户端操作,生成key 每次提交修改到服务器的时候都会要求输入密码,这个比较麻烦,为了解决这个问题,可以将客户端用户ssh key写入服务器端git用户的authorized_keys文件中,具体操作
1、在客户端shell命令行输入: ssh-keygen 会在~/.ssh/id_rsa.pub 这个公钥文件 windows:会让选择目录,;默认:(/c/Users/Administrator/.ssh/id_rsa)
2、把上面这个公钥文件内容上传到git服务器,保证git用户可读
服务器在su到git用户状态时输入 cat id_rsa.pub >> ~/.ssh/authorized_keys
#10.服务器端 Git 打开 RSA 认证
进入 /etc/ssh 目录,编辑 sshd_config,打开以下三个配置的注释:
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
保存并重启 sshd 服务:
[root@localhost ssh]# /etc/rc.d/init.d/sshd restart 由 AuthorizedKeysFile 得知公钥的存放路径是 .ssh/authorized_keys,实际上是 $Home/.ssh/authorized_keys,由于管理 Git 服务的用户是 git,所以实际存放公钥的路径是 /home/git/.ssh/authorized_keys #11.客户端命令 ##1.clone git clone git@192.168.0.118:/git/test.git test1 ##2.各源同步本地更改 第一次 git push -u origin master 以后: git push origin master 把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。 如果要推送其他分支,比如dev,就改成: $ git push origin dev ##3.更改后添加到提交staged,本地 git add somefile ##4.提交更改(本地) git commit ##5.关联一个远程库 git remote add origin git@server-name:path/repo-name.git ##6.分支 察看:git branch 创建分支:git branch 切换分支:git checkout 创建+切换分支:git checkout -b 切换回master分支:$ git checkout master 把dev分支的工作成果合并到master分支上:git merge dev 删除dev分支:$ git branch -d dev git branch -D branch_name 合并dev分支,禁用fast-forward:git merge --no-ff -m "merge with no-ff" dev
分支管理策略 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。 下面我们实战一下--no-ff方式的git merge: 首先,仍然创建并切换dev分支: $ git checkout -b dev switched to a new branch 'dev' 修改readme.txt文件,并提交一个新的commit: $ git add readme.txt $ git commit -m "add merge" [dev 6224937] add merge 1 file changed, 1 insertion(+) 现在,我们切换回master: $ git checkout master Switched to branch 'master' 准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward: $ git merge --no-ff -m "merge with no-ff" dev Merge made by the 'recursive' strategy. readme.txt | 1 + 1 file changed, 1 insertion(+) 因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。 合并后,我们用git log看看分支历史: $ git log --graph --pretty=oneline --abbrev-commit
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本; ##8. 创建一个工作现场:git stash 列出:git stash list 恢复工作现场并删除:git stash pop=git stash apply+git stash drop ##9.察看远程库的信息 git remote -v
git pull 对应的反动作是push ##11.多人协作的工作模式: ###1.首先,可以试图用git push origin branch-name推送自己的修改; ###2.如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并; ###3.如果合并有冲突,则解决冲突,并在本地提交; ###4.没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功! 如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。 这就是多人协作的工作模式,一旦熟悉了,就非常简单。 在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致 git checkout -b branch-name origin/branch-name 建立本地分支和远程分支的关联: git branch --set-upstream branch-name origin/branch-name ##12.标签 $ git branch
推送某个标签到远程,使用命令git push origin : 次性推送全部尚未推送到远程的本地标签:$ git push origin --tags
##13 remote 关联远程库:git remote add origin git@192.168.0.118:/git/test/git 查看远程库信息:git remote -v 删除已关联的名为origin的远程库 :git remote rm origin 使用多个远程库时,我们要注意,git给远程库起的默认名称是origin,如果有多个远程库,我们需要用不同的名称来标识不同的远程库 git remote add github git@github.com:michaelliao/learngit.git git remote add gitee git@gitee.com:liaoxuefeng/learngit.git ##14.git config --global color.ui true $ git config --global alias.st status git config --global alias.co checkout $ git config --global alias.ci commit $ git config --global alias.br branch git config --global alias.last 'log -1' git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" ##15.忽略特殊文件 .gitignore文件
Thumbs.db ehthumbs.db Desktop.ini
git 多模块项目
1.各模块需要有单独的版本管理 2.整体上需要有可用的各模块版本 Git Submodule管理项目子模块
当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能。
常用命令 git clone --recursive 递归的方式克隆整个项目 git submodule add 添加子模块 git submodule init 初始化子模块 git submodule update 更新子模块 git submodule foreach git pull 拉取所有子模块
例如我们要创建如下结构的项目
project |--moduleA |--readme.txt 创建project版本库,并提交readme.txt文件
git init --bare project.git git clone project.git project1 cd project1 echo "This is a project." > readme.txt git add . git commit -m "add readme.txt" git push origin master cd ..
git init --bare moduleA.git git clone moduleA.git moduleA1 cd moduleA1 echo "This is a submodule." > a.txt git add . git commit -m "add a.txt" git push origin master cd ..
cd project1 git submodule add ../moduleA.git moduleA git status git diff git add . git commit -m "add submodule" git push origin master cd .. 使用git status可以看到多了两个需要提交的文件,其中.gitmodules指定submodule的主要信息,包括子模块的路径和地址信息,moduleA指定了子模块的commit id,使用git diff可以看到这两项的内容。这里需要指出父项目的git并不会记录submodule的文件变动,它是按照commit id指定submodule的git header,所以.gitmodules和moduleA这两项是需要提交到父项目的远程仓库的。
On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD ..." to unstage) new file: .gitmodules new file: moduleA
先clone父项目,再初始化submodule,最后更新submodule,初始化只需要做一次,之后每次只需要直接update就可以了. 需要注意submodule默认是不在任何分支上的,它指向父项目存储的submodule commit id
git clone project.git project2 cd project2 git submodule init git submodule update cd ..
采用递归参数--recursive 需要注意同样submodule默认是不在任何分支上的,它指向父项目存储的submodule commitid。
git clone project.git project3 --recursive
__修改子模块之后只对子模块的版本库产生影响,对父项目的版本库不会产生任何影响__如果父项目需要用到最新的子模块代码,我们需要更新父项目中submodule commit id,默认的我们使用git status就可以看到父项目中submodule commit id已经改变了,我们只需要再次提交就可以了。
cd project1/moduleA git branch echo "This is a submodule." > b.txt git add . git commit -m "add b.txt" git push origin master cd .. git status git diff git add . git commit -m "update submodule add b.txt" git push origin master cd ..
更新子模块的时候要注意子模块的分支默认不是master。
##方法一 先pull父项目,然后执行git submodule update, 注意moduleA的分支始终不是master。
cd project2 git pull git submodule update cd ..
先进入子模块,然后切换到需要的分支,这里是master分支,然后对子模块pull, 这种方法会改变子模块的分支。
cd project3/moduleA git checkout master cd .. git submodule foreach git pull cd ..
git rm --cached moduleA rm -rf moduleA rm .gitmodules vim .git/config 删除submodule相关的内容,例如下面的内容
[submodule "moduleA"] url = /Users/nick/dev/nick-doc/testGitSubmodule/moduleA.git 然后提交到远程服务器
git add . git commit -m "remove submodule"
但是我自己本地实验的时候,发现用下面的方式也可以,服务器记录的是.gitmodules和moduleA,本地只要用git的删除命令删除moduleA,再用git status查看状态就会发现.gitmodules和moduleA这两项都已经改变了,至于.git/config,仍会记录submodule信息,但是本地使用也没发现有什么影响,如果重新从服务器克隆则.git/config中不会有submodule信息。
git rm moduleA git status git commit -m "remove submodule" git push origin master
将分支推送到远程分支 git push zhrungit dev:dev
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。