Git用法

参考文档

配置

客户端

  • 用户信息
git config --global user.name "Your Name Here"
#Sets the default name for git to use when you commit
 
git config --global user.email "your_email@example.com"
#Sets the default email for git to use when you commit
  • 颜色高亮
git config color.diff "auto" 
git config color.status "auto" 
git config color.branch "auto" 
git config color.interactive "auto" 
git config color.grep "auto"
  • 无需输入用户名的方法
vim .git/config
 
#修改
 
[remote "origin"]  
    url = https://github.com/<name>/example.git  
#为:
[remote "origin"]  
    url = https://<name>@github.com/<name>/example.git
  • 无需输入用户名和密钥的方法

配置密钥

  • 在Windows下生成密钥

ssh-keygen -t rsa (git bash),key的目录会有提示。

服务器

参考:https://git-scm.com/book/en/v1/Git-on-the-Server-Setting-Up-the-Server

# create user for git
adduser git
 
# add some developer SSH public keys to the authorized_keys(for git user)
cat /path/to/key/id_rsa.pub >> /home/git/.ssh/authorized_keys
# 如果clone还提示要输入密码的话,检查公钥是否是添加到git用户下的authorized_keys里。
 
# create project directory
mkdir project.git
 
# initiail repository
cd project.git
git --bare init
 
# change owner to git user(such as 'git')
chown git.git -R project.git
 
# clone URL, default port is 22.
git clone ssh://git@host:port/path/to/git/project.git


注意:项目所有者必须为对应的用户(如git)

命令用法

基础

git config -l
#查看配置信息
 
git clone git://github.com/someone/some_project.git
#克隆一个远程项目到本地
 
git pull
# 从其他的版本库(既可以是远程的也可以是本地的)将代码更新到本地,
# 例如:'git pull origin master'就是将origin这个版本库的代码更新
# 到本地的master主枝,该功能类似于SVN的update
 
git add
# 是将当前更改或者新增的文件加入到Git的索引中,加入到Git的索引中就
# 表示记入了版本历史中,这也是提交之前所需要执行的一步,
# 例如'git add app/model/user.rb'就会增加app/model/user.rb文件到Git的索引中。
# 'git add -A'添加当前目录下所有文件。
 
git rm
#从当前的工作空间中和索引中删除文件,例如'git rm app/model/user.rb'
 
git status
#查看本地项目的状态
 
git commit
# 提交当前工作空间的修改内容,类似于SVN的commit命令,
# 例如'git commit -m "story #3, add user model"',提交的时候必须用-m来输入一条提交信息
 
# commit时换行
git commit -m "line 1
line 2
line 3"
# or
git commit -F- <<EOF
line 1
line 2
line 3
EOF
 
# commit通过vim来编辑
git commit -a
 
git push
#将本地commit的代码更新到远程版本库中,例如'git push origin'就会将本地的代码更新到名为orgin的远程版本库中
 
git log
#查看历史日志
 
git revert
# 还原一个版本的修改,必须提供一个具体的Git版本号,
# 例如'git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20',
# Git的版本号都是生成的一个哈希值.
 
git clean -df
git reset --hard
#撤销操作
#第一个命令只删除所有untracked的文件,如果文件已经被tracked, 修改过的文件不会被回退。
#而第二个命令只把tracked的文件revert到前一个版本,对于untracked的文件(比如编译的临时文件)都不会被删除。
 
git commit --amend --author="Your Name <you@example.com>"
# 修改上一次提交的用户名和Email
 
# 修改上一次commit
git commit --amend -m "New commit message"
# 如果已经提交到服务器,需要执行下面操作
git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

创建仓库

mkdir project-directory
cd project-directory/
git init
 
# then add files and commit
 
# push to remote
git remote add origin ssh://xxx@host:port/repo
git push origin master

标签

git tag
#列出标签
 
git checkout 'tag'
#切换到指定标签的代码
 
git tag -a v1.0 -m 'my version 1.0'
#新建标签
 
git show v1.0
#查看标签详情
 
git tag -d 'tag name'
#删除标签
 
git push origin v1.0
#把标签传送到远端服务器

分支

git branch -a
# 查看所有分支
 
git branch 'branch name'
# 创建本地分支
 
git push 'remote name' 'branch name'
git push origin 'branch name'
# 推送本地分支到远程服务器
 
git branch -d 'branch name'
# 删除本地分支
 
git fetch
git checkout -b 'local branch name' origin/remote_branch_name
# 获取远程分支
 
git push origin --delete 'branch name'
# 删除远程分支
 
git checkout master
git merge 'branch name'
# 合并分支

子模块

git submodule update --init --recursive

参考:https://git-scm.com/book/zh/v1/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97

patch

# 生成patch
# 1)两个节点之间的提交: 
git format-patch node-A node-B
# 2)单个节点: 
git format-patch -1 node-A  #(-n就表示要生成几个节点的提交)
# 3)最近一次提交节点的patch :
git format-patch HEAD^ 
#依次类推……
 
# 使用patch
# 打补丁
patch -p1 < *.patch
# 恢复旧版
patch -RE -p1 < *.patch
 
# 补充:非git可通过diff来生成patch

svn

# 拷贝svn目录
svn checkout svn://host/path/to/project
 
# 添加文件
svn add file
 
# 查看日志
svn log path

GitLab

安装

# 1. 安装依赖软件
sudo yum install curl policycoreutils openssh-server openssh-clients
sudo systemctl enable sshd
sudo systemctl start sshd
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld
 
# 2.1. yum安装
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo yum install gitlab-ce
 
# 2.2. 或rpm包安装。对应安装包到https://packages.gitlab.com/gitlab/gitlab-ce找
curl -LJO https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-XXX.rpm/download
rpm -i gitlab-ce-XXX.rpm
 
# 3. 常用命令
sudo gitlab-ctl reconfigure    # 编译/配置
sudo gitlab-ctl tail    # 查看日志
sudo gitlab-ctl [start|stop|status|...]    # 开启/关闭/查看状态
 
# 4. 配置文件
/etc/gitlab/gitlab.rb <br/>
/opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
 
# 5.端口冲突问题:如有端口冲突问题,结合日志和配置文件分析。

导入git项目

# e.g. from ssh git project
git remote add gitlab url-to-gitlab-repo
git push gitlab master

svn迁移到git

# 1. 生成用户对应关系
 
svn log /svn/path | grep line | awk -F '|' '{print $2}' |  sort | uniq -c | awk '{print $2}' | awk '{printf("%s = %s <%s@xunlei.com>\n", $1, $1, $1);}' > users.txt
 
# 2. 从svn克隆代码
 
git svn clone http://path/to/svn --authors-file=users.txt --no-metadata [keyword]
 
# 3. 在gitlab上创建项目的仓库,并添加到remotes
 
git remote add origin git@gitlab.example.com:user/path/to/git/repo/example.git
 
# 4. push到gitlab
 
git push origin --all
 
# 5.分支迁移(没做过)

常见问题

  • 修改root密码
# 1.到 gitlab 安装路径 && gitlab-rails console production
cd YOUR_GITLAB_PATH && sudo gitlab-rails console production
 
# 2.
u=User.where(id:1).first
 
# 3.
u.password = 'YOUR_PASSWORD' and u.password_confirmation = 'YOUR_PASSWORD'
 
# 4.
u.save!

常见问题

  • warning: LF will be replaced by CRLF in ***
# 解决方法
git config --global core.autocrlf false
  • warning: push.default is unset; its implicit value is changing in Git 2.0 from 'matching' to 'simple'.
# 解决方法,按提示设置即可,建议
git config --global push.default simple
source: http://liudonghua.net/wiki/Git