下载安装
配置
本地创建ssh key
ssh-keygen -t rsa -C "your_email@example.com"
输入注册的邮箱,之后要求确认路径和输入密码。成功会在~/下生成.ssh文件夹,进去,打开id_rsa.pub,复制里面的key
在github上,进入Account Settings(账户配置),左边选择SSH Keys,Add SSH Key,title填上,粘贴在你电脑上生成的key
验证是否成功,在git bash下输入:
ssh -T git@github.com
You've successfully authenticated, but GitHub does not provide shell access 。这就表示已成功连上github
id_rsa文件时私有密钥,id_rsa.pub是公开密钥
然后
本地仓库上传,需要先设置username和email,因为github每次commit都会记录他们
git config --global user.name "Firstname Lastname"
git config --global user.email "your_email@example.com"
这个命令,会在“~/.gitconfig ”中以一下形式输出设置文件
[user]
name = Firstname Lastname
email =your_email@example.com
想要更改这些信息时,可以直接编辑这个设置文件
进入要上传的仓库,右键git bash,添加远程地址
git remote add origin git@github.com:yourName/yourRepo.git
yourName和yourRepo表示在github的用户名和仓库,加完之后进入.git,打开config,这里会多出一个remote "origin"内容,这就是刚才添加的远程地址,也可以直接修改config来配置远程地址
创建新文件夹,打开,然后执行 git init 以创建新的 git 仓库
检出仓库
执行如下命令以创建一个本地仓库的克隆版本:
git clone /path/to/repository
如果是远端服务器上的仓库,命令会是这个样子:
git clone username@host:/path/to/repository
提高命令输出的可读性
将color.ui设置为去偷可以让命令的输出拥有更高的可读性。
git config --global color.ui auto
"~/.gitconfig"中会增加一行
[color]
ui = auto
GitHub上的头像时通过Gravatar服务显示的。使用过WordPress可能对它有所了解。
许可协议
在GitHub上公开了源代码,也不代表著作者放弃了著作权等权利。代码的权利持有人请选择合适的许可协议。在GitHub上,有修正BSD许可协议、Apache许可协议等多种许可协议供人们选择,不过大多数软件都是用MIT许可协议。MIT的内容可依照著作权者的需求更改内容。MIT许可协议可与其他许可协议并存。MIT条款也是自由软件基金会(FSF)所认可的自由软件许可协议条款,与GPL兼容。
实际使用时,只需将LICENSE文件加入仓库,并在README.md文件中声明使用了何种许可协议即可。
工作流
本地仓库由 git 维护的三棵"树"组成。
第一个是 工作目录,它持有实际文件;
第二个是 暂存区(Index),它像个缓存区域,临时保存改动;
最后是 HEAD,它指向最后一次提交的结果
可以提出更改(把它们添加到暂存区),使用如下命令
git add <filename>
git add *
使用如下命令以实际提交改动
git commit -m '提交信息'
现在,改动已经提交到了 HEAD,但是还没到远端仓库
推送改动
执行如下命令以将这些改动提交到远端仓库
git push origin master
可以把 master 换成你想要推送的任何分支
如果还没有克隆现有仓库,并欲将仓库连接到某个远程服务器,可以使用如下命令添加
git remote add origin <server>
这样就能够将改动推送到所添加的服务器上去了
初始化
git init
Git 使用 git init 命令来初始化一个 Git 仓库
该命令执行完后会在当前目录生成一个 .git 目录
git init newrepo
使用指定目录作为Git仓库.初始化后,会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。
git add *.c
git add README
git commit -m '初始化项目版本'
以上命令将目录下以 .c 结尾及 README 文件提交到仓库中
git clone <repo>
从现有 Git 仓库中拷贝项目
git clone <repo> <directory>
克隆到指定的目录
repo:Git仓库
directory:本地目录
git ststus -s
git status 命令用于查看项目的当前状态
git add README hello.php
添加文件
git add .
添加所有文件
修改README文件
执行'git status -s'
A表示已添加
AM状态表示,这个文件在我们将它添加到缓存之后又有改动
'git status'查看详细内容
'-s' 参数,简短信息输出
git diff
查看执行 git status 的结果的详细信息
git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别
两个主要的应用场景:
未缓存的改动:'git diff'
查看已缓存的改动: 'git diff --cached'
查看已缓存的与未缓存的所有改动:'git diff HEAD'
显示摘要而非整个 diff:'git diff --stat'
git commit
使用 git add 命令将想要快照的内容写入缓存区, 而执行 git commit 将缓存区内容添加到仓库中
在此之前要配置名字与电子邮箱地址,Git 为你的每一个提交都记录你的名字与电子邮箱地址
git config --global user.name 'test'
git config --global user.email test@test.com
git commit -m '第一次版本提交'
使用 -m 选项以在命令行中提供提交注释
如果你没有设置 -m 选项,Git 会尝试为你打开一个编辑器以填写提交信息。 如果 Git 在你对它的配置中找不到相关信息,默认会打开 vim
git commit -a
用 -a 选项跳过git add这一步
再次修改一下hello.php
git commit -am '修改 hello.php 文件'
git reset HEAD
用于取消已缓存的内容
改动README,hello.php
两个文件修改后,都提交到了缓存区,现在要取消其中一个的缓存,操作如下:
'''
$ git status -s
M README
M hello.php
$ git add .
$ git status -s
M README
M hello.php
$ git reset HEAD hello.php
Unstaged changes after reset:
M hello.php
$ git status -s
M README
M hello.php
'''
执行 git commit,只会将 README 文件的改动提交,而 hello.php 是没有的
可以使用以下命令将 hello.php 的修改提交:
git commit -am '修改hello.php'
git status
简而言之,执行 git reset HEAD 以取消之前 git add 添加,但不希望包含在下一提交快照中的缓存
如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 Changes not staged for commit 的提示。
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交。可以用以下命令完成此项工作
git rm <file>
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
git rm -f <file>
如果把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 --cached 选项即可
git rm --cached <file>
递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件:
git rm -r *
'git mv'用于移动或重命名一个文件、目录、软连接
git mv README README.md
分支管理
创建分支
git branch (branchname)
除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的
git push origin <branch>
切换分支
git checkout (branchname)
切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录
合并分支
git merge
更新与合并
更新本地仓库至最新改动:
git pull
在你的工作目录中 获取(fetch) 并 合并(merge) 远端的改动
要合并其他分支到你的当前分支:
git merge <brancu>
在这两种情况下,git 都会尝试去自动合并改动。遗憾的是,这可能并非每次都成功,并可能出现冲突(conflicts)。 这时候就需要你修改这些文件来手动合并这些冲突(conflicts)。改完之后,你需要执行如下命令以将它们标记为合并成功:
git add <filename>
在合并改动之前,可以使用如下命令预览差异:
git diff
分支管理
列出分支
git branch
有一个叫做"master"的分支,并且该分支是当前分支
执行 git init 的时候,缺省情况下 Git 就会为你创建"master"分支
git checkout -b (branchname)
创建新分支并立即切换到该分支下
删除分支
git branch -d(branchname)
合并冲突
可以用 git add 要告诉 Git 文件冲突已经解决
查看提交历史
git log
可以用 --oneline 选项来查看历史记录的简洁的版本
git log --oneline
可以用 --graph 选项,查看历史中什么时候出现了分支、合并。以下为相同的命令,开启了拓扑图选项:
git log --oneline --graph
可以用 '--reverse'参数来逆向显示所有日志
git log --reverse --oneline
查找指定用户的提交日志可以使用命令:git log --author
git log --author=XiaoMing --oneline --5
要指定日期,可以执行几个选项:--since 和 --before,但是也可以用 --until 和 --after
git log --oneline --before={3.weeks.ago} --after={2019-05-02} --no-merges
三周前且在5月2日之后的所有提交(还用了 --no-merges 选项以隐藏合并提交)
Git 标签
如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签
git tag -a v1.0
-a 选项意为"创建一个带注解的标签"
执行 git log --decorate 时,可以看到标签
git log --oneline --decorate --graph
忘了给某个提交打标签,又将它发布了,可以给它 追加标签
git tag -a v1.0
查看所有标签
git tag
指定标签信息
git tag -a <tagname> -m "test标签"
PGP签名标签命令
git tag -s <tagname> -m "test标签"
替换本地改动
假如操作失误(这最好永远不要发生),可以使用如下命令替换掉本地改动:
git chekout --<filename>
此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。
假如想丢弃在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将本地主分支指向它:
git fetch origin
git reset --hard origin/master
远程仓库
github
查看当前配置有哪些远程仓库
git remote
git remote -v
加上 -v 参数,可以看到每个别名的实际链接地址
提取远程仓库
从远程仓库下载新分支与数据
git fetch
该命令执行完后需要执行git merge 远程分支到所在的分支
从远端仓库提取数据并尝试合并到当前分支
git merge
在执行 git fetch 之后紧接着执行 git merge 远程分支到你所在的任意分支
假设配置好了一个远程仓库,并且想要提取更新的数据,可以首先执行 git fetch [alias] 告诉 Git 去获取它有你没有的数据,然后你可以执行 git merge [alias]/[branch] 以将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支
在线修改,本地更新
git fentch origin
git merge origin/master
推送到远程仓库
推送新分支与数据到某个远端仓库命令
git push [alias] [branch]
删除远程仓库
git remote rm [别名]
添加仓库 origin2
git remote add origin2 git@github.com:yourname/yourrepo.git
删除仓库 origin2
git remote rm origin2
git remote -v
使用 CODING 仓库
国内用户 GitHub 的访问速度太慢。腾讯云开发者平台。除了提供免费的 Git 仓库之外,免费的私有仓库(免费的普通会员提供 10 个私有项目、512M Git 仓库容量)
将 GitHub 上的代码迁移到 CODING。通常,分为三步:
1、创建 CODING 项目
2、将 GitHub 代码 Pull 到本地
登录 GitHub 选择你想要导入的仓库并复制仓库地址,在本地执行命令,将 GitHub 仓库代码拉下来
3、本地关联 CODING 仓库,Push 代码到 CODING
git remove -v
sudo git remote rm origin
sudo git remotre add origin https://git.codng.net/xxx/xxx.git
sudo git push -u origin master
之后,再次进入 CODING 项目中代码管理的页面,便可以看到刚才 Push 上去的代码了。至此、GitHub 上的项目已经完整迁移到了 CODING 平台
CODING 仓库的免密码 Push/Pull
代码迁移到 CODING 之后,我们发现,每次 Push/Pull 代码的时候都会提示我们输入用户名和密码。这是因为,我们的项目还没有添加 SSH Key,只能通过用户名/密码验证。 而 CODING 是为我们提供了公钥验证的方式的,进入项目管理,在左侧选项卡中点击"公钥部署"按钮,然后点击右侧的"新建公钥部署"
将本地的公钥内容粘贴到对应位置,并且给公钥命名一下...
勾选"授予推送权限"则可以授予这台机器Push代码的权限。
保存好设置后,再次尝试。此时,Push/Pull 代码不在需要验证用户名密码。至此,代码便完全托管在了 CODING 平台上
Git服务器搭建
搭建一台Git服务器作为私有仓库使用。其他人看不到这个项目
以 Centos 为例搭建 Git 服务器
安装Git
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
yum install git
创建一个git用户组和用户,用来运行git服务
groupadd git
useradd git -g git
创建证书登录
收集所有需要登录的用户的公钥,公钥位于id_rsa.pub文件中,把我们的公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
如果没有该文件创建它:
cd /home/git/
mkdir /ssh
chmod 755 .ssh
touch .ssh/authorized_keys
chmod 644 .ssh/authorized_keys
初始化Git仓库
首先选定一个目录作为Git仓库,假定是/home/gitrepo/test.git,在/home/gitrepo目录下输入命令:
cd /home
mkdir gitrepo
chown git:git gitrepo/
cd gitrepo
git init --bare test.git
以上命令Git创建一个空仓库,服务器上的Git仓库通常都以.git结尾。然后,把仓库所属用户改为git:
chown -R git:git test.git
克隆仓库
git clone git@192.168.x.x:/home/gitrepo/test.git
192.168.x.x为 Git 所在服务器 ip
Git 服务器安装完成
~
内建的图形化git:
gitk
彩色git输出:
git config color.iu true
显示历史记录时,每个提交的信息只显示一行:
git config format.pretty oneline
交互式添加文件到暂存区:
git add -i