- git环境搭建
- 初始化命令
git init把当前目录变成Git可以管理的仓库。
- 关联远程库
git remote add origin git@github.com:xxx/xxx.git;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
git fetch [remote-name]//该命令会到远程仓库中拉取所有你本地仓库中还没有的数据。
在Windows上更新了git 版本后,clone/pull时出现错误,
unable to negotiate with *.*.*.*: no matching key exchange methodfound. Their offer: diffie-hellman-group1-sha1
解决方法:在执行git pull/clone之前,输入:
export GIT_SSH_COMMAND='ssh -o KexAlgorithms=+diffie-hellman-group1-sha1'
这种方法每次打开git窗口,都要重新输入一次。
可以在C:\Users\Spring\.ssh的config文件下,添加内容如下,
Host *.*.*.*
KexAlgorithms +diffie-hellman-group1-sha1
- git文件添加
添加文件到Git仓库,分两步:
命令:git add <file>命令把要提交的所有修改放到暂存区;
命令:git commit -m <message>,使更改上传至版本库中。
命令:git commit --amend修改提交,使用ESC+ZZ退出编辑或shift + : +wq即出
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:
- git版本回退
用HEAD表示当前版本
上一个版本就是HEAD^
上上一个版本就是HEAD^^
上100个版本写成HEAD~100
git reset命令进行回退版本,git reset --hard HEAD^
git reset --hard 1094a(commit id),本地文件会被修改
git reset --soft 1094a(commit id),本地文件不会被修改
git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区。
- git文件回退
git checkout命令可以撤销修改:
1)修改后还没有被放到暂存区,撤销修改就回到和版本库一模一样的状态;
2)已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令
git checkout changeid filename//将文件回到changeid 对应的版本
$ git checkout .//当前目录所有修改的文件 从HEAD中签出并且把它恢复成未修改时的样子,如果其对应的文件被修改过,那么该修改会被覆盖掉。
- 从远程获取
- 远程克隆
git clone git@github.com:xxx/xxx.git远程库克隆至本地,目录名与远程库同名
$ git clone <版本库的网址> <本地目录名>//远程库克隆至本地,指定目录名
- 从远程获取
git fetch origin branch1:branch2
使用远程branch1分支在本地创建branch2(但不会切换到该分支),如果本地不存在branch2分支, 则会自动创建一个新的branch2分支,
如果本地存在branch2分支, 并且是`fast forward', 则自动合并两个分支, 否则, 会阻止以上操作
- 获取某次提交的文件
$ git checkout commit_id file_name #//取文件file_name的 在commit_id是的版本。commit_id为 git commit 时的sha值。
- 获取并合并
$git pull <远程主机名> <远程分支名>:<本地分支名>//取回远程主机某个分支的更新,再与本地的指定分支合并;
$ git pull origin next//将取回origin/next分支,再与当前分支合并;
- 推送至远程
$ git push <远程主机名> <本地分支名>:<远程分支名>
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
$git push origin master:master或$git push origin master (在local repository中找到名字为master的branch,使用它去更新remote repository下名字为master的branch,如果remote repository下不存在名字是master的branch,那么新建一个)
$git push origin master:refs/for/mybranch (在local repository中找到名字为master的branch,用他去更新remote repository下面名字为mybranch的branch)
$git push origin HEAD:refs/for/mybranch (HEAD指向当前工作的branch,master不一定指向当前工作的branch,所以我觉得用HEAD还比master好些)
$git push origin :mybranch (再origin repository里面查找mybranch,删除它。用一个空的去更新它,就相当于删除了)
其中refs/for 的意义在于我们提交代码到服务器之后是需要经过code review 之后才能进行merge的,而refs/heads 不需要。如:
git push origin HEAD:refs/for/QinlingS
- git分支操作
$ git branch dev//创建dev分支
$ git checkout master #//取出master版本的head。
$git checkout -b dev//创建并跳转至dev分支
$git branch -d dev//删除本地dev分支
$git push origin –delete dev//删除远程dev分支
$ git checkout tag_name #//在当前分支上 取出 tag_name 的版本
$ git checkout master file_name #//放弃当前对文件file_name的修改
$ git checkout commit_id file_name #//取文件file_name的 在commit_id是的版本。commit_id为 git commit 时的sha值。
$ git checkout -b newBranch origin/master//在远程master分支创建新分支newBranch
$ git checkout -b dev/1.5.4 origin/dev/1.5.4//从远程dev/1.5.4分支取得到本地分支/dev/1.5.4
$git merge dev//命令用于合并指定分支(dev)到当前分支
$git checkout -b branch-name origin/branch-name//在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致;
$git branch --set-upstream branch-name origin/branch-name//建立本地分支和远程分支的关联;
- git信息查看
$git log命令显示从最近到最远的提交日志
$git log -p file//查看file的变更记录,会列出具体更改内容
$git log file//查看file的变更记录,只列出更改commit-id及对应的log
$git reflog用来记录你的每一次命令
$git status查看本地仓库状态
$git remote -v查看远程库信息
- 其它命令
$ git stash//把当前工作现场“储藏”起来
$ git stash pop//恢复储藏的工作现场,同时把stash内容也删了
$ git cherry-pick commit-id//将commit-id的提交应用到当前分支,生成一个新的commit。
$ git revert commit-id//撤销指定的版本,撤销也会作为一次提交进行保存。
$ git rebase origin//把当前分支更新到最新的"origin"分支