[转-谢谢]
1仓库
1 克隆git库
open cmd
cd F:
$ git clone git@192.168.1.4:fatcat/zbase.git
$ git status -s
$ git merge origin/master
2 平时使用–仓库更新
; 右键: git Bash Here 直接切换路径.
$ git remove -v
$ git branch -a
$ git fetch
$ git merge origin/master
; 一般情况下只是更新 master分支.
3 更新仓库.(master分支没有变,learnTemp2 “add readme8 from other computer”)
$ git fetch
;可以看到磁盘文件未发生变化.
$ git merge origin/master
;可以看到磁盘文件"仍然未"发生变化.
4 git更新指令(master分支有更新)
$ git fetch
; 可以看到磁盘文件未发生变化,需要合并
$ git merge origin/master
; 已经变了.
------------
$ git rebase
; First, rewinding head to replay your work on top of it...
; Fast-forwarded master to refs/remotes/origin/master.
------------
$ git rebase origin/master
5 更新远程其他分支
$ git branch -a
$ git fetch origin learnTemp
; From 192.168.1.4:gao/learnTest
; * branch learntemp -> FETCH_HEAD
; 更新下来了,但是看不见.
$ git branch -a
; 可以合并
$ git rebase
..??
2远程分支管理
1 创建新的远程分支
$ git checkout -b temp
$ git add readme6.txt
$ git commit -m"add readme6 "
$ git push origin temp:learnTemp
; git push [远程名] [local_branch_name]:[remote_branch_name]
------再接着创建一个分支,会多2次提交,把temp的也算上了.
$ git checkout -b temp2
$ git add readme7.txt
$ git commit -m"add readme7"
$ git push origin temp:learnTemp2
2 删除远程分支
$ git remote -v
$ git branch -a
$ git push origin :servBranchForDel
; git push [远程名] :[remote_branch_name] ;注意冒号前的空格.
$ git push origin :learnTset
3 远程其他分支并合并到master
$ git remote -v ;查看远程连接
$ git branch -a ;查看远程分支
$ git checkout -b temp(和远程名一样最好:learnTest) origin/learnTest
$ git branch
; 合并分支
$ git checkout master ;切换到master
$ git merge --no-ff -m" merge temp(origin/learnTest) To master" temp
$ git branch -d temp
$ git barnch
$ git status -s
4 多人协作–解决冲突
; 比如其他人修改master分支的readnme9.txt了。现在我也修改了并要提交
$ git push origin master
; 出现错误。error: failed to push some refs to 'git@github.com:michaelliao/learngit.git'
; git pull 拉取最新的到本地,合并失败需要下面紧跟的指令。
$ git branch --set-upstream master origin/master
; Branch dev set up to track remote branch dev from origin.
$ git pull
; 会提示解决冲突:Automatic merge failed; fix conflicts and then commit the result.
; 需要手动修改冲突的文件 readme9.txt.
$ git add readme9.txt
$ git commit -m "merge confict readme9.txt"
$ git push origin master ;
5 模拟两个人同时对仓库更新.(更新learnTemp2分支)
$ git clone git@192.168.1.4:gao/learnTest.git ;克隆下来的往往是master分支。
;从另一台电脑上 clone 仓库,发现克隆到的只是master分支。(文件里没有readme6.readme7)
$ git remote -v
$ git branch -a
$ git checkout -b temp2 origin/learnTemp2
$ git status -s
; 磁盘完成操作:增加 readme8.txt
$ git add --all
$ git commit -m" add readme8.txt"
$ git push origin temp2:learnTemp2
; 可以到服务器看到分支 learnTemp2 更新了.
; 完成以后可以删除分支.
$ git checkout master
$ git barnch -D temp2
; 查看状态--推送master(如果master没有干什么),服务器不会显示这次提交。
$ git status -s
$ git push origin master
; Everything up-to-date.
6 追踪分支:更新远程分支方法二
; 切换到远程分支
$ git checkout --track origin/learnTemp2_1
$ git add --all
$ git commit -m " add 1234 文件夹"
$ git push
; 稍等刷新发现远程已经更新了.
7 追踪分支:下面开始删除1234文件夹
$ git checkout --track origin/learnTemp2_1
; fatal: A branch named 'learnTemp2_1' already exists.
; 因为上面已经创建了一个'追踪分支',所以再次创建就已经存在了.
; 假如此时你切换到其他分支干活了,要切换回来,直接按本地命令执行。
$ git checkout learnTemp2_1
$ git rm -rf 1234
; rm '1234/readme3.txt'
; rm '1234/readme4.txt'
$ git push
-----此时查看分支
$ git branch -a
; * learnTemp2_1
; learntemp
; master
; temp
; remotes/origin/HEAD -> origin/master
; remotes/origin/learnTemp2_1
; remotes/origin/learntemp
; remotes/origin/master
8 追踪分支:合并远程分支learnTemp2_1 到 learnTemp
$ git branch -a
$ git checkout --track origin/learnTemp2_1
$ git checkout --track origin/learnTemp
$ git merge -m" 合并 temp2_1" learnTemp2_1
$ git push
$ git push origin :learnTemp2_1
$ git branch -d learnTemp2_1
$ git branch -a
9 删除远程分支上的文件。
$ git branch -a
$ git checkout -b temp origin/learnTemp
$ git rm readme3.txt
$ git status -s
$ git commit " del readme3.txt"
$ git push origin temp:learnTemp
$ git branch -d temp
发现远程基本都是更新到本地,修改 ,完成后再推到远程,对远程做修改(如删除分支).
3 工作区 和 暂存区 –文件删除
; '工作区' : 在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区.
; '暂存区'的概念.
; '版本库' : 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
; 廖雪峰 老师的图描述的很清楚.
; 注意:放在工作区的文件在(没有被任何分支提交前,切换分支的时候一直存在(磁盘上或者git status 查看)
新建一个空文件夹,git status -s 查看时无反应.
1 删除文件
1 从工作区删除 “未提交” 的文件
$ rm filename
$ rm -rf directory
$ git rm errlook.exe ;fatal: pathspec 'errlook.exe' did not match any files
2 add后未提交
$ git rm errlook.exe
; error: the following file has changes staged in the index: errlook.exe
; (use --cached to keep the file, or -f to force removal)
$ git rm --cached errlook.exe
$ git status ; ??errlook.exe
$ git ls-files ; 已经不包含。
--或者
$ git rm -f errlook.exe ; 强制删除。
-------
$ rm 已经不能删了,提交时会提交的。
3 分支里的: 从工作区和暂存区同时删除文件。
$ git rm filename
$ git rm –r directory ;从仓库中删除文件夹
$ git rm -rf directory
$ git commit -m" "
; 提交前发现删错了
$ git checkout -- test.txt
; 提交后发现删错了
$ git reset --hard HEAD^
3 分支里的: 从分支删除,工作区保留。
$ git rm --cached errlook.exe
; rm 'errlook.exe'
$ git ls-files
; diy.chm
; readme4.txt
; readme5.txt
; readme6.txt
$ git status -s
; D errlook.exe
; ?? errlook.exe
$ git commit -m " del errlook"
; [learntemp 46723cc] del errlook
; 1 file changed, 0 insertions(+), 0 deletions(-)
; delete mode 100644 errlook.exe
$ git status -s
?? errlook.exe
------
$ rm errlook.exe ; 即便提交后切换分支后还会有,可见不会删除。
$ git ls-files
2 重命名文件
1 工作区未add
$ git status -s
; ?? diy1.chm
; $ git mv diy1.chm diy2.chm ; fatal: not under version control.
---------
$ mv diy1.chm diy2.chm ;改名
$ git status -s
; A diy3.chm
2 add后未提交
$ git add --all
$ git status -s
; A diy2.chm
$ git mv diy2.chm diy3.chm ;改名
-------
$ mv diy3.chm diy4.chm
$ git status -s
; AD diy3.chm
; ?? diy4.chm ;重新复制了一个到diy5 到工作区.
3 分支里的
$ git mv diy.chm diyVir.chm ;改名
$ mv diy3.chm diy5.chm ;重新复制了一个到diy5 到工作区.
3总结:add后就被git接管了,$ git ls-files 就会有显示,应该用 $ git xx 指令.
#git commit –a –m “修改说明”
如果觉得刚提交的“修改说明”写得不够好,可输入以下命令调整
$ git commit --amend
显示最后一次 commit 修改的内容:
$ git show
4 版本回退
1 工作区对文件修改还没有add
$ git checkout --readme.txt
2 已经add了还未commit
$ git reset --hard HEAD^
$ git checkout --readme.txt
3 切换到相应分支
$ git log --pretty=oneline 或者 git reglog
$ git reset --hard HEAD^
$ git reset --hard commit_id
4 只回退一个文件
$ git fetch
; 修改了好几个文件。其中有个是不需要修改的。单个文件回退
$ git checkout -- bin/zbase/ps08.vdb
$ git checkout --bin/zbase/ps07.vdb ;error : 注意中间的空格。
$ git status -s
; 所有的都回退
$ git reset --hard HEAD^ (or commit)
$ git status -s
回退已经提交的修改。
用暂存区覆盖工作区 git checkout -- file 可以丢弃工作区的修改
用分支覆盖暂存区 git reset HEAD file 可以丢弃暂存区的修改
4 推送到远程了.
5 git rebase
; readme10.txt:输入 " printf("master:001"); "
$ git add --readme10.txt
$ git commit -m "master 001 "
; readme10.txt:继续输入 " printf("master:002"); "
$ git add --readme10.txt
$ git commit -m "master 002 "
$ git log ; master 001 --> master 002
; 切换分支
$ git checkout -b topic
; readme10.txt:输入 " printf("topic:001"); "
$ git add --readme10.txt
$ git commit -m "topic 001 "
; readme10.txt:继续输入 " printf("topic:002"); "
$ git add --readme10.txt
$ git commit -m "topic 002 "
$ git log ;topic 001 --> topic 002 / master 001 --> master 002
$ git checkout master
; readme10.txt:输入 " printf("master:003"); "
$ git add --readme10.txt
$ git commit -m "master 003 "
; readme10.txt:继续输入 " printf("master:004"); "
$ git add --readme10.txt
$ git commit -m "master 004 "
$ git log
$ git checkout topic
$ git rebase master
; git rebase
; 可能会遇到类似冲突的。先手动解决。完了需要add
$ git add --all
$ git rebase --continue
$ git log ;master 001 --> master 002-->master003-->master004-->topic001-->topic002
; 从最后的结果看(分支结构图):相当于先更新主分支master,完了更新topic分支。(不是按时间)
6 git commit
; 提交的时候没输入 -m"." 会自动进入vim窗口.
; 下移光标到~ 或者# 的最后一行,输入 your commit.
; 1 esc
; 2 :
; 3 wq or q! 退出
按i然后写入,写入后按esc键,然后输入:wq
再输入q!或wq!(不保存改动,wq!是保存文件的写入修改)退出
7 add 目录
使用git add dirName/files的方式添加文件
如果提示失败请用带-f 参数来添加文件
8 git pull –rebase origin master
可以通过如下命令进行代码合并【注:pull=fetch+merge]
$ git pull --rebase origin master
如果提示合并失败,是由于本地有修改的还未保存(正好是你不想上传的)
$ git stash
$ git pull --rebase origin master
$ git status -s
$ git push origin BranchName
$ git status -s
$ git stash list
$ git stash clear
9 git mv
$ git mv filefrom fileto
相当于手动从src文件夹剪贴到dest文件夹,并提交.
也相当于更改名字功能。
======================
$ mv filefrom fileto
$ git rm filefrom
$ git add fileto
用git status -s 可以查看状态为 R(绿)
10 git GUI
-1 在带有.git的工程目录下右键(git GUI)
-2 左上角框显示已修改文件,左键单击文件前图标==add到左下角。
-3 左键单击文件前图标==取消add
-4 右下角 添加注释-commit.
-5 右上角显示文件的修改内容.
--------------------------------------------
-1 Repositry-->visual P_0627's history.
$ vi
$ vi readme10.txt 命令修改的。