2 Star 1 Fork 0

zhrun8899 / learning-notes

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
git.md 18.09 KB
一键复制 编辑 原始数据 按行查看 历史
zhrun8899 提交于 2019-08-15 14:35 . 20190815 commit

centos7下git服务器端搭建

1.查看并卸载旧git

git --version yum remove git

2.依赖库安装

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum install gcc perl-ExtUtils-MakeMaker

3.下载新源码

cd /usr/local
mkdir git
cd git

wget https://github.com/git/git/archive/v2.9.2.tar.gz

4. 解压当前目录

tar -xzvf v2.9.2.tar.gz

5. 安装 Git

分别执行以下命令进行编译安装,编译过程可能比较漫长,请耐心等待完成。
cd git-2.9.2
make prefix=/usr/local/git all
make prefix=/usr/local/git install

6.添加到系统路径

vi /etc/profile,在最后添加:
export PATH="/usr/local/git/bin:$PATH" 
source /etc/profile

7.查看

git --version

8. 将git设置为默认路径,不然后面克隆时会报错

[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 

9.创建一个git用户组和用户,用来运行git服务

$ groupadd git
$ useradd git -g git
$ passwd git  #参数是用户名

10.Git服务器打开RSA认证 。在Git服务器上首先需要将/etc/ssh/sshd_config中将RSA认证打开,

1.RSAAuthentication yes

2.PubkeyAuthentication yes

3.AuthorizedKeysFile .ssh/authorized_keys

11.收集客户端的公钥,并保存到.ssh/authorized_keys 中

12.初始化Git仓库

cd /home/git mkdir gitrepos/test.git cd test.git git init --bare --shared

13 测试

1.在服务端测试

git clone test.git test 完成后在test中能看到 .git目录,可进行编辑文件,提交等测试

2.客户端测试

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并推送到远程仓库中

1. 目标:

把本地已经存在的项目,推送到github服务端,实现共享。

2. 实现步骤:

(1). 先在服务器创建一个空的仓库

cd /home/git/gitrepos/ mkdir test.git cd test.git git init --bare --shared

(2). 初始化本地仓库,并提交内容到本地

cd uaopWeb git init

git add -A git commit

(3). 连接到远程仓库,并将代码同步到远程仓库

1). git remote add origin 远程仓库地址

git add remote git@192.168.0.41:/home/git/gitrepos/test.git git push -u origin master

2). git push -u origin master

(4). 继续修改本地代码,然后提交并推送到github

做完上面三个步骤之后,就实现了将本地代码同步到github的功能,接下来要做的事情就是继续修改代码,然后提交并推送到github

1). git add .

2). git commit -m ‘提交说明’

3). git pull

如果是多人协作开发的话,一定要先 pull ,将 github 的代码拉取到本地,这样在 merge 解决冲突的时候稍微简便些。默认拉取到 master分支(如果只是自己做这个项目,可以忽略pull)

4). git push

将代码推送到 github , 默认推送到 别名为 origin 的仓库中的 master 分支上。

5). 注意事项:

如果有多个远程仓库 或者 多个分支, 并且需要将代码推送到指定仓库的指定分支上,那么在 pull 或者 push 的时候,就需要 按照下面的格式书写:

git pull 仓库别名 仓库分支名 git push 仓库别名 仓库分支名


命令

显示当前分支的版本历史

$ git log

显示当前的Git配置

$ git config --list

可以添加一个或多个

$ git add <file1> <file2>...
#添加所有修改的和新添加的
$ git add .
另一种写法
$ git add -A

恢复上一次add提交的所有file

$ git reset HEAD

提交到本地仓库(commit操作)

提交暂存区的所有文件(后面的message不可缺少)

$ git commit -m <message>

提交暂存区的指定文件

$ git commit <file1> <file2> -m <message>

.gitignore的配置:

缘由:当我们导入一个git项目时,开发环境会改变里面的一些配置,当我们修改完代码后,add,commit操作后,系统更改的配置信息,并不想去提交,这个时候就会用到这个配置,配置完成后,才更好的去add .和commit -m去操作。

gitignore处理

要在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

2.下载 git 源码

wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz

3.源码安装

3.1 解压

tar -zxf git-2.9.5.tar.gz

3.2 安装

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

3.3 安装

make prefix=/usr/local install

4. 编译好的文件安装

yum install git-core

5.在 Windows 上安装

在 Windows 上安装 Git 同样轻松,有个叫做 msysGit 的项目提供了安装包,可以到 GitHub 的页面上下载 exe 安装文件并运行: http://msysgit.github.com/

6.试用

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

  • 7825a50 merge with no-ff |
    | * 6224937 add merge |/
  • 59bc1cb conflict fixed ... 可以看到,不使用Fast forward模式,merge后就像这样: git-no-ff-mode ##7.分支策略 在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,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

10.把最新的提交从origin抓下来

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

  • dev master $ git checkout master Switched to branch 'master' 然后,敲命令git tag 就可以打一个新标签: $ git tag v1.0 可以用命令git tag查看所有标签: git tag v0.9 6224937,其中的6224937是用git log查出来的 $ git tag 删除:$ git tag -d v0.1 标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除: $ git tag -d v0.9 Deleted tag 'v0.9' (was 6224937) 然后,从远程删除。删除命令也是push,但是格式如下: $ git push origin --delete tag show

推送某个标签到远程,使用命令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文件

Windows:

Thumbs.db ehthumbs.db Desktop.ini

auto created files

最后一步就是把.gitignore也提交到Git.git add .gitignre git commit ##16.撤销修改 git checkout -- readme.txt 命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况: 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态; 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。 ##17.撤销add git reset HEAD readme.txt git reset --hard commitNo 重新回到某版本号 显示所有提交:git reflog 然后可以再回到较新版本

git 多模块项目

要求:

1.各模块需要有单独的版本管理 2.整体上需要有可用的各模块版本 Git Submodule管理项目子模块

使用场景

当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能。

常用命令 git clone --recursive 递归的方式克隆整个项目 git submodule add 添加子模块 git submodule init 初始化子模块 git submodule update 更新子模块 git submodule foreach git pull 拉取所有子模块

1. 创建带子模块的版本库

例如我们要创建如下结构的项目

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 ..

2.创建moduleA版本库,并提交a.txt文件

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 ..

3.在project项目中引入子模块moduleA,并提交子模块信息

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

4. 克隆带子模块的版本库

方法一

先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

5. 修改子模块

__修改子模块之后只对子模块的版本库产生影响,对父项目的版本库不会产生任何影响__如果父项目需要用到最新的子模块代码,我们需要更新父项目中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 ..

6. 更新子模块

更新子模块的时候要注意子模块的分支默认不是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 ..

7. 删除子模块

网上有好多用的是下面这种方法

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

1
https://gitee.com/zhrun8899/learning-notes.git
git@gitee.com:zhrun8899/learning-notes.git
zhrun8899
learning-notes
learning-notes
master

搜索帮助