一,配置账户,注意需要和Github账户设置一样
git config --global user.name xxx
git config --global user.email xxx@foxmail.com
二,查看配置
git config --list
user.name=xxx
user.email=xxx@foxmail.com
三,创建Git仓库
一,本地创建一个新仓库
$ git clone http://git.dayuan.cc/practice/git-exmple.git
cd git-exmple
$ git remote add origin http://git.dayuan.cc/practice/git-exmple.git 、
$ git add .
$ git commit -m "Initial commit"
$ git push -u origin master
二,在已经存在的目录中创建仓库
cd existing_folder
$ git init
$ git remote add origin http://git.dayuan.cc/practice/git-exmple.git
$ git add .
$ git commit -m "Initial commit"
$ git push -u origin master
三,拉取远程分支并创建本地****分支
// dev2为远程分支,dev1为本地分支
$ git checkout -b dev1 origin/dev2;
从远程分支dev拉取到本地并且创建本地分支dev,且俩者之间建立映射关系,同时当前分支会切换到dev1
//dev2为远程分支,dev1为本地分支
$ git fetch origin dev2:dev1;
使用该方式会在本地新建分支dev1,但是不会自动切换到该本地分支dev1,需要手动checkout。采用此种方法建立的本地分支不会和远程分支建立映射关系。
四,将本地已存在的仓库推送到****远程仓库
cd existing_repo
$ git remote rename origin old-origin
$ git remote add origin http://git.dayuan.cc/practice/git-exmple.git
$ git push -u origin --all
$ git push -u origin --tags
四,查看Git状态
git status
一般来说会显示需要提交的文件(uncommited)和未追踪的文件(untracked)
uncommited:已有的,刚被修改尚未提交的
untracked:原先没有的,新建的
查看分支相关命令
$ git branch -r; //查看远程分支
$ git branch; //查看本地分支
$ git branch -a; //查看所有分支
建立本地分支与远程分支的映射关系(或者为跟踪关系track)
这样使用git pull或者git push时就不必每次都要指定从远程的哪个分支拉取合并和推送到远程的哪个分支了。
$ git branch -vv
输出映射关系
// dev为远程分支名
$ git branch -u origin/dev
将当前本地分支与远程分支建立映射关系
$ git branch --unset-upstream
撤销当前本地分支与远程分支的映射关系
切换当前本地分支
// dev为本地分支名
$ git checkout dev;
拉取远程分支代码
使用的前提是当前分支需要与远程分支之间建立映射关系
推送本地分支代码到远程分支
$ git push
使用的前提是当前分支需要与远程分支之间建立映射关系
合并分支
现在有dev本地分支与远程分支,master本地分支与远程分支现在将dev的分支代码合并到master主干上
1.切换到本地分支dev上,并且pull拉取一下远程dev分支上的改动地方
2.将所有本地修改进行commit并且push到远程dev分支上,保证没有遗漏的,确保当前本地dev与远程dev是一致的
3.将当前本地分支切换到本地master上
4.将本地分支dev合并到本地master上
5.将本地已经合并了dev分支的master进行push到远程master上 大概思路就是这样。需要注意的是在进行merge(合并)的时候需要禁用fast-forward模式
具体的合并命令: git merge --no-ff dev (dev为本地被合并的分支名字)
辅助分支
feature分支:
从 develop 分支建一个 feature 分支,并切换到 feature 分支
$ git checkout -b myfeature develop
Switched to a new branch "myfeature"
合并feature 分支到 develop :
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff myfeature
Updating ea1b82a..05e9557
(Summary of changes)
$ git branch -d myfeature
Deleted branch myfeature
$ git push origin develop
上面我们 merge 分支的时候使用了参数 --no-ff,ff 是fast-forward的意思,--no-ff就是禁用fast-forward。
release分支
新建rlease分支:
$ git checkout -b release-1.2 develop
Switched to a new branch "release-1.2"
$ ./bump-version.sh 1.2File modified successfully, version bumped to 1.2.
$ git commit -a -m "Bumped version number to 1.2"
[release-1.2 74d9424] Bumped version number to 1.2
1 files changed, 1 insertions(+), 1 deletions(-)
release 分支合并到 master 分支 :
$ git checkout master
Switched to branch 'master'
$ git merge --no-ff release-1.2
Merge made by recursive. (Summary of changes)
$ git tag -a 1.2
release 分支合并到 develop 分支
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff release-1.2
Merge made by recursive. (Summary of changes)
删除 release 分支
$ git branch -d release-1.2
Deleted branch release-1.2 (was ff452fe).
hotfix分支
新建hotfitx分支
$ git checkout -b hotfix-1.2.1 master
Switched to a new branch "hotfix-1.2.1"
$ ./bump-version.sh 1.2.1
Files modified successfully, version bumped to 1.2.1.
$ git commit -a -m "Bumped version number to 1.2.1"
[hotfix-1.2.1 41e61bb] Bumped version number to 1.2.1
1 files changed, 1 insertions(+), 1 deletions(-)
Fix bug
$ git commit -m "Fixed severe production problem"
[hotfix-1.2.1 abbe5d6] Fixed severe production problem
5 files changed, 32 insertions(+), 17 deletions(-)
buffix 之后,hotfix 合并到 master
$ git checkout master
Switched to branch 'master'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2.1
hotfix 合并到 develop 分支
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)
删除 hotfix 分支 u
$ git branch -d hotfix-1.2.1
Deleted branch hotfix-1.2.1 (was abbe5d6).
五,添加Git文件到暂存区(需要和版本库区分)
git add
六,Git提交文件
git commit -m "add a function in test.java"
-m表示注释,为提交时的说明,必须要有!
七,Git删除文件(夹)
git rm test.txt//删除文件
git rm -r filebook //删除文件夹
git rm和直接删除的区别在于git rm会将此文件的操作记录删除,而直接删除仅仅是删除了物理文件,没有删除和此文件相关的记录。git rm后会在版本库产生区别(有操作日志),而直接删除没有。
git rm test.txt => git commit -m 'delete a file'rm test.txt => git commit -am 'delete a file'注意:命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
八,Git操作日志
git log --decorate --graph --oneline --all #显示当前及之前的版本号
git log --pretty=oneline #将版本历史显示为一行,历史版本号全部显示
git log --pretty=oneline --abbrev-commit #将版本历史显示为一行,历史版本号部分显示
git log --graph #查看分支合并图
九,版本回退
执行版本退回后,本地工作区的内容会自动和回退到的版本库版本的内容保持同步
git reset --hard HEAD^ 回退到上一个版本
git reset --hard HEAD^^ 回退到上上个版本,以此类推,一次提交即为一个版本
git reset --hard e9efa77 回退到 e9efa77 版本
这种方式回退代码的弊端显而易见 ,回退后的版本会失去之后提交的信息, 所以,有些公司明令禁止使用 git reset命令去回退代码
故此,Git Revert 就诞生了 !
git revert的作用通过反做创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针是指向这个新生成的版本,而不是目标版本。
$ git revert -------
当然,我们还可以批量回退!
$ git revert OLDER_COMMIT^..NEWER_COMMIT
错误的提交 C 和 D 依然保留,将来进行甩锅的时候也有依可循。而这种做法,正是企业所鼓励的。
十,Git暂存区撤销操作
工作区修改了文件,而且执行了add,但还没执行commit,暂存区还是可以撤销的
git reset HEAD readme.txt
备注:git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。