Git 基本使用及工作流程详解
一、Git 用户信息配置
# 设置全局用户名和邮箱 $ git config --global user.name "xxx" $ git config --global user.email "xxx@xxx.com"
二、从远程仓库获取目录
# 在已经有远程仓库的情况下使用,比如新入职一家公司 ## 进入一个文件夹,用于放置clone下来的代码 $ cd test ## 把远程仓库代码clone下来 $ git clone https://github.com/xxxx/xxxx.git $ cd git_demo ##查看状态 $ git status ## 默认远程仓库名为origin On branch master Your branch is up-to-date with 'origin/master'. nothing to commit, working directory clean
三、修改和增加代码并推送
## 添加所有修改的文件,也可以git add xx.txt 指定某个文件 $ git add . ## 提交修改 $ git commit -m "update" ## 推送到远程仓库 $ git push
四、分支
# 一般情况下,当我们需要添加一个新功能的时候,是不能在主分支上直接修改的,这时,需要创建一个新的分支,等功能开发并测试完成之后,再合并到主分支。 #假设我们需要新建一个临时分支test来处理一个问题。 ## 新建一个test分支 $ git branch test ## 切换到test分支 $ git checkout test Switched to branch 'test' ## 查看分支,当前已经在test分支上面 $ git branch * test master ## 在当前分支上进行一些修改,把内容‘123123’添加到hello.txt文件中 $ echo "123123" >> hello.txt ## 添加并提交修改到本地 $ git add hello.txt $ git commit -m "add hello.txt" ## 推送到远程,因为现在远程还没有test分支,所以需要set-upstream ## 这样,在远程仓库就有了test分支,之后可以直接push $ git push --set-upstream origin test ## test解决后,把修改合并会master,并删除test分支 ## 切换到主分支 $ git checkout master Switched to branch 'master' Your branch is up to date with 'origin/master'. ## 把test分支的内容合并到主分支master $ git merge test Updating 2d0f8f9..bc9a5ca Fast-forward qwe | 1 + 1 file changed, 1 insertion(+) create mode 100644 qwe ##删除分支test $ git branch -d test Deleted branch wy (was bc9a5ca). ## push $ git push Total 0 (delta 0), reused 0 (delta 0) To https://github.com/xxxx/xxxx.git 2d0f8f9..bc9a5ca master -> master ## 删除远程分支 $ git push origin :test To https://github.com/xxxx/xxxx.git - [deleted] test
五、本地自建一个仓库
六、pull他人提交的代码
#在我们完成了某项功能的修改,需要push的远程的时候,协作者可能已经提交了他们的修改,这时,我们需要先把最新的提交拉取下来,加入我们的修改,再重新提交上去。
$ git push
## push被驳回了,因为有其他人已经提交了更新
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'https://github.com/xxxx/xxxx.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
## 拉取远程提交内容并合并到当前工作区
$ git pull
## 重新push到远程
$ git push
七、冲突处理
#当拉取别人提交的代码时,很可能不同开发者修改了同一个文件的同一部分,这时候,就会出现冲突,我们需要手动解决这些冲突,再重新提交上去。 $ git pull remote: Counting objects: 5, done. remote: Compressing objects: 100% (2/2), done. remote: Total 5 (delta 2), reused 5 (delta 2), pack-reused 0 Unpacking objects: 100% (5/5), done. From github.com/xxxx/xxxx.git 7d4f14a..e2e17d3 master -> origin/master ## 尝试自动合并file1 Auto-merging file1 ## 发现冲突,需要手动解决冲突 CONFLICT (content): Merge conflict in file1 Automatic merge failed; fix conflicts and then commit the result. ## 此时,git已经把可能冲突的地方都写进了文件 $ vim file1 ## 可以看见冲突的地方 <<<<<<< HEAD file1 + add 1 ======= file1 + del 4 >>>>>>> e2e17d311ec33700e94ce5dd694aa340920deb7c ## vim里手动解决冲突后,add进来 $ git add file1 $ git commit -m "resolve confict in file1" ## 推送到远程分支 $ git push
八、本地分支与远程分支关联
# 在远程已有master和dev分支的情况下,如果想在本地提交一个文件到远程的dev分支,可以进行以下操作 # 当前本地只有一个分支 $ git branch * master # 创建本地分支dev并直接切换 $ git checkout -b dev Switched to a new branch 'dev' # 本地分支与远程分支相关联 $ git pull origin dev From https://git.coding.net/wylycool/database * branch dev -> FETCH_HEAD Already up to date. # 这时开始提交文件 $ git add . $ git commit -m '123' [dev fe41cad] 123 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 123.txt #进行到这儿, 以下两个任选一个 # 其一,本地dev可以不同步到远程dev,直接切换到主分支后merge dev,使用master同步远程代码 $ git checkout master Switched to branch 'master' Your branch is up to date with 'origin/master'. $ git merge dev $ git push # 其二,可以把本地dev和远程dev关联起来,同步远程dev代码,此时远程dev有了新提交的文件,然后再换到master合并 $ git push --set-upstream origin dev Enumerating objects: 3, done. Counting objects: 100% (3/3), done. Delta compression using up to 2 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (2/2), 243 bytes | 121.00 KiB/s, done. Total 2 (delta 1), reused 0 (delta 0) To https://git.coding.net/wylycool/database.git 87392f6..fe41cad dev -> dev Branch 'dev' set up to track remote branch 'dev' from 'origin'.