git学习--01

2016-04-03 | 阅读

git详细使用说明

还是重新认真学习一下git吧

本地仓库,由git维护的三个分支:

  1. 是当前的工作目录 , 它持有实际文件
  2. 是缓存区 (Index), 缓存区域,当使用 git add 命令,就将更新内容添加到缓存区进行保存
  3. 是HEAD, 指向最近一次提交后的结果.使用 git commit 命令提交的改动,放在HEAD中.

提交改动到远程仓库,如果没有仓库,使用

git remote add origin <server>

来绑定连接服务器.如果想要清空之前的git源,使用这条命令:

git remote remove origin 

git的分支管理

使用checkout 命令来切换分支,如果想要创建一个新的分支,并切换,如下:

git checkout -b new_branch

删除分支使用 -d 命令, 分支一般是保存在本地的,当然也可以推送到远程仓库:

git push origin <branch>

其他

git pull # 更新本地仓库
git merge <branch> #合并其他分支到当前所在分支
git diff <source_branch><target_branch> #检测分支间的差异
git log #查看版本更新内容,和标签ID
git tag 1.0.0 1b2e3d4fff #添加标签
git checkout -- <filename> #将该内容替换为HEAD中的最新内容

# 丢弃本地所有改动与提交,并获得服务器中最新内容,并指向该分支
git fetch origin
git reset --hard origin/master

git config color.ui true #彩色的git输出

搭建git服务器

sudo apt-get install git #安装git
sudo adduser git #添加一个git账户,使用这个账户来进行git相关服务
git init --bare server.git #创建一个git仓库
chown -R git:git server.git #将仓库owner改为git.

要使每次git用户登录时,只是为了获取git相关的内容,而不能登入shell,需要登录时,跳转到git-shell,而不是bash,通过编辑/etc/passwd 文件. 文件中改为:

git:x:500:500::/home/git:/usr/bin/git-shell
which git-shell #查看程序的安装地址.

要免密登录,需要将ssh生成的公钥提供给git服务器.

本地生成ssh公钥密钥文件:

ssh-keygen -t rsa -C "luoxianmingg@gmail.com"

需要输入密码和确认保存地址,全部按回车忽略.

生成的文件会出现在 ~/.ssh 中,有两个文件,一个是私钥 id_rsa, 一个是公钥 id_rsa.pub ,获取公钥的值,保存到 /home/git/.ssh/authorized_keys文件中.

将公钥的值保存到github -settings -ssh keys 中就可以免密与github进行连接了.

由于修改了ssh的端口号,导致默认的git依旧使用22端口,而无法正常连接,所以要更改git地址 类似如下地址:

git clone ssh://git@linuxidc.com:10086/home/git/server.git

在搭建git服务器遇到一个问题

无法登陆服务器端创建的git用户,使用su git时,报错:

fatal: could not chdir to user's home directory

原因是文件夹得权限不对,在查看得知:

drwx------   4 1000 git  4096 1月  24 18:07 git

git用户的文件路径不属于git用户,所以要将该文件夹赋给git用户:

chown git git 

然后再次查看:

drwx------   4 git  git  4096 1月  24 18:07 git

正常了,然后git服务器可以正常使用.

git clone ssh://git@115.28.192.172:12826/home/git/server.git

Git撤销本地

git push 失败:

error: failed to push some refs to 'https://github.com/CodingForMoney/CodingForMoney.github.io.git'
hint: Updates were rejected because the tip of your current branch is behind

原因是本地git不是最新的,解决方法可以强制提交,或者先pull再提交,或者创建分支.

git 撤销commit :

git reset --hard <commit_id> #撤销到指定版本

HEAD #这次提交
HEAD^ #上一次提交.

git全局性忽略

Mac目录有一个.DS_Store文件,用来存储当前文件夹信息.一定要忽略这个文件.还有其他一些文件也是需要忽略的.全局性忽略的设置,需要创建文件.gitignore_global.

# .gitignore_global
####################################
######## OS generated files ########
####################################
.DS_Store
.DS_Store?
*.swp
# 不忽略这个文件
!123.swp

~/.gitconfig文件中引入这个.gitignore_global:

[core]
excludesfile =/Users/lxm/.gitignore_global

项目内忽略

在仓库目录下,建立一个.gitignore文件,然后该文件会对所在目录和全部子目录有效.上传到仓库,别人更新时,也会共享这套忽略规则.

简单的格式规范为:

  • 使用标准的glob进行匹配.
  • 匹配模式可以用/开头,来防止递归.
  • 匹配模式可以用/结尾,来指定目录
  • 忽略指定模式命中的文件,前面加上!号.

简单的示例:

*.a
.DS_Store
# 忽略指定的文件夹
/dir1
# 忽略所有的文件夹
dir2/
# 忽略所有的dir文件夹下的所有.pdf文件
dir3/**/*.pdf

Git的tag处理

// 推送远程tag
git push origin <tagname>
// 获取远程分支
git fetch origin tag <tagname>
//展示tag
git tag
// 删除tag
git push origin --delete tag <tagname>

git的tag分为两种,轻量标签lightweight,和附注标签annotated,前者像一个不会改变的分支,是一次提交的应用,而后者则是完整的标签.

附注标签需要指定-a,是一次完整的提交,也需要-m.

迁移git库

#git仓库的迁移
git clone --bare git://github.com/username/project.git

Git协议,使用git-daemon

使用git-daemon :

git daemon --reuseaddr --base-path=/usr/local/cocoaPodsRepo /usr/local/cocoaPodsRepo

--reuseaddr 允许服务器在无需等待旧连接超时的情况下重启,--base-path 选项允许用户在未完全指定路径的条件下克隆项目,结尾的路径将告诉 Git 守护进程从何处寻找仓库来导出。 如果有防火墙正在运行,你需要开放端口 9418 的通信权限。

但是git-daemon是守护进程,需要设置守护进程,Mac中设置开机启动项,还是比较麻烦的.

处理好后,要在需要公开的git库的.git目录下,添加一个文件git-daemon-export-ok.

Mac中的守护进程

需要在开机启动时设置的守护进程,一种方式是在 /System/Library/LaunchAgents或者/Library/LaunchAgents路径下,为系统启动后立即启动的进程.该路径下内容都是一些plist,其主要字段和含义为:

  • Label 用来在launchd中的一个唯一标识,类似于每一个程序都有一个identifies一样。
  • UserName 指定运行启动项的用户,只有当Launchd 作为 root 用户运行时,此项才适用。
  • GroupName 指定运行启动项的组,只有当Launchd 作为 root 用户运行时,此项才适用。
  • KeepAlive 这个key值是用来控制可执行文件是持续运行呢,还是满足具体条件之后再启动。默认值为false,也就是说满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。
  • RunAtLoad 标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。
  • Program 这个值用来指定进程的可执行文件的路径。
  • ProgramArguments 如果未指定Program时就必须指定该项,包括可执行文件文件和运行的参数。

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
              <key>Label</key>
              <string>com.lxm.macmini.git-daemon</string>
              <key>ProgramArguments</key>
              <array>
                      <string>git</string> 
                      <string>daemon</string>
                      <string>--reuseaddr</string>
                      <string>--base-path=/usr/local/cocoaPodsRepo</string>
                      <string>/usr/local/cocoaPodsRepo</string>
              </array>
              <key>StandardOutPath</key>
              <string>/usr/local/cocoaPodsRepo/abc.log</string>
              <key>StandardErrorPath</key>
              <string>/usr/local/cocoaPodsRepo/abcerror.log</string> 
              <key>KeepAlive</key>
              <true/>
      </dict>
      </plist>
    

设置好plist文件后,要将用户组设为wheel,用户为管理员,然后权限为741,才能调用launchctl来设置开机启动.

launchctl load com.alecyan.testcron.plist  
launchctl unload com.alecyan.testcron.plist  
launchctl start com.alecyan.testcron.plist  
launchctl stop com.alecyan.testcron.plist  
launchctl list