دسترسی نامحدود
برای کاربرانی که ثبت نام کرده اند
برای ارتباط با ما می توانید از طریق شماره موبایل زیر از طریق تماس و پیامک با ما در ارتباط باشید
در صورت عدم پاسخ گویی از طریق پیامک با پشتیبان در ارتباط باشید
برای کاربرانی که ثبت نام کرده اند
درصورت عدم همخوانی توضیحات با کتاب
از ساعت 7 صبح تا 10 شب
ویرایش: 2020-04-10
نویسندگان: James Coglan
سری:
ناشر: James Coglan
سال نشر: 2020
تعداد صفحات: 733
زبان: English
فرمت فایل : PDF (درصورت درخواست کاربر به PDF، EPUB یا AZW3 تبدیل می شود)
حجم فایل: 6 مگابایت
کلمات کلیدی مربوط به کتاب ساخت Git: گیت یاقوت
در صورت تبدیل فایل کتاب Building Git به فرمت های PDF، EPUB، AZW3، MOBI و یا DJVU می توانید به پشتیبان اطلاع دهید تا فایل مورد نظر را تبدیل نمایند.
توجه داشته باشید کتاب ساخت Git نسخه زبان اصلی می باشد و کتاب ترجمه شده به فارسی نمی باشد. وبسایت اینترنشنال لایبرری ارائه دهنده کتاب های زبان اصلی می باشد و هیچ گونه کتاب ترجمه شده یا نوشته شده به فارسی را ارائه نمی دهد.
Building Git یک فرو رفتن عمیق در داخل سیستم کنترل نسخه Git است. با بازسازی آن در یک زبان برنامه نویسی سطح بالا، علم کامپیوتر را در پشت این ابزار پرکاربرد بررسی می کنیم. در این فرآیند، ما درک عمیق تری از خود Git به دست می آوریم و همچنین مجموعه گسترده ای از موضوعات برنامه نویسی کاربردی را پوشش می دهیم، از جمله: مفاهیم یونیکس خواندن و نوشتن از فایل ها، اتمی جلوه دادن نوشته ها، از شرایط مسابقه بین فرآیندها جلوگیری می کند راه اندازی فرآیندهای کودک در پیش زمینه و پس زمینه، برقراری ارتباط همزمان با آنها نمایش خروجی در ترمینال، از جمله قالب بندی رنگ، خروجی صفحه، و تعامل با ویرایشگر متن کاربر تجزیه فرمت های مختلف فایل، از جمله مدل commit مبتنی بر درخت مرکل Git، فهرست، فایل های پیکربندی و فایل های شی بسته بندی شده ساختارهای داده چگونه Git محتوا را روی دیسک ذخیره می کند تا از فضا استفاده موثری کند، تاریخچه را برای جستجو کارآمد کند و تشخیص تفاوت بین تعهدات را آسان کند. استفاده از diffs برای بهروزرسانی مؤثر محتویات فضای کاری هنگام بررسی یک commit جدید استفاده موثر از ساختارهای داده در حافظه ساده برای حل مسائل برنامه نویسی تجزیه و تفسیر یک زبان پرس و جو برای آدرس دهی commit ها ویرایش همزمان چگونه Git از شاخه ها برای مدل سازی ویرایش های همزمان استفاده می کند الگوریتم هایی برای تشخیص تفاوت بین نسخه های فایل و ادغام مجدد شاخه ها با یکدیگر چرا تداخل ادغام اتفاق می افتد، چگونه می توان از آنها اجتناب کرد، و چگونه Git به کاربران کمک می کند تا از به روز رسانی های از دست رفته جلوگیری کنند چگونه می توان از ادغام به عنوان مبنایی برای عملیات های متعدد برای ویرایش تاریخچه commit استفاده کرد مهندسی نرم افزار بوت استرپ و رشد یک سیستم میزبانی خود توسعه آزمایش محور Refactoring برای فعال کردن توسعه ویژگی های جدید طراحی نرمافزاری فقط با خرابی که اجازه میدهد برنامهها قطع و از سر گرفته شوند شبکه سازی استفاده از SSH برای بوت استرپ یک پروتکل شبکه نحوه ارتباط مخازن Git برای به حداقل رساندن داده هایی که باید هنگام واکشی محتوا منتقل کنند چگونه پروتکل شبکه از عملیات اتمی برای جلوگیری از بازنویسی تغییرات یکدیگر توسط کاربران استفاده می کند
Building Git is a deep dive into the internals of the Git version control system. By rebuilding it in a high-level programming language, we explore the computer science behind this widely used tool. In the process, we gain a deeper understanding of Git itself as well as covering a wide array of broadly applicable programming topics, including: Unix concepts Reading and writing from files, making writes appear atomic, prevent race conditions between processes Launching child processes in the foreground and background, communicating with them concurrently Displaying output in the terminal, including colour formatting, paged output, and interacting with the user’s text editor Parsing various file formats, including Git’s Merkle-tree-based commit model, the index, configuration files and packed object files Data structures How Git stores content on disk to make effective use of space, make the history efficient to search, and make it easy to detect differences between commits Using diffs to efficiently update the contents of the workspace when checking out a new commit Effectively using simple in-memory data structures to solve programming problems Parsing and interpreting a query language for addressing commits Concurrent editing How Git uses branches to model concurrent edits Algorithms for detecting differences between file versions and merging branches back together Why merge conflicts happen, how they can be avoided, and how Git helps users prevent lost updates How merging can be used as the basis for numerous operations to edit the commit history Software engineering Bootstrapping and growing a self-hosting system Test-driven development Refactoring to enable new feature development Crash-only software design that allows programs to be interrupted and resumed Networking Using SSH to bootstrap a network protocol How Git repositories communicate to minimise the data they need to transfer when fetching content How the network protocol uses atomic operations to prevent users overwriting each other’s changes
Building Git
Contents
Change history
1. (1.0.0) February 25th 2019
2. (1.0.1) May 22nd 2019
3. (1.0.2) October 31st 2019
4. (1.0.3) April 10th 2020
License and acknowledgements
1. Introduction
1.1. Prerequisites
1.2. How the book is structured
1.3. Typographic conventions
1.4. The Jit codebase
2. Getting to know .git
2.1. The .git directory
2.1.1. .git/config
2.1.2. .git/description
2.1.3. .git/HEAD
2.1.4. .git/info
2.1.5. .git/hooks
2.1.6. .git/objects
2.1.7. .git/refs
2.2. A simple commit
2.2.1. .git/COMMIT_EDITMSG
2.2.2. .git/index
2.2.3. .git/logs
2.2.4. .git/refs/heads/master
2.3. Storing objects
2.3.1. The cat-file command
2.3.2. Blobs on disk
2.3.3. Trees on disk
2.3.4. Commits on disk
2.3.5. Computing object IDs
2.3.6. Problems with SHA-1
2.4. The bare essentials
Part I. Storing changes
3. The first commit
3.1. Initialising a repository
3.1.1. A basic init implementation
3.1.2. Handling errors
3.1.3. Running Jit for the first time
3.2. The commit command
3.2.1. Storing blobs
3.2.2. Storing trees
3.2.3. Storing commits
4. Making history
4.1. The parent field
4.1.1. A link to the past
4.1.2. Differences between trees
4.2. Implementing the parent chain
4.2.1. Safely updating .git/HEAD
4.2.2. Concurrency and the filesystem
4.3. Don’t overwrite objects
5. Growing trees
5.1. Executable files
5.1.1. File modes
5.1.2. Storing executables in trees
5.2. Nested trees
5.2.1. Recursive trees in Git
5.2.2. Building a Merkle tree
5.2.3. Flat or nested?
5.3. Reorganising the project
6. The index
6.1. The add command
6.2. Inspecting .git/index
6.3. Basic add implementation
6.4. Storing multiple entries
6.5. Adding files from directories
7. Incremental change
7.1. Modifying the index
7.1.1. Parsing .git/index
7.1.2. Storing updates
7.2. Committing from the index
7.3. Stop making sense
7.3.1. Starting a test suite
7.3.2. Replacing a file with a directory
7.3.3. Replacing a directory with a file
7.4. Handling bad inputs
7.4.1. Non-existent files
7.4.2. Unreadable files
7.4.3. Locked index file
8. First-class commands
8.1. Abstracting the repository
8.2. Commands as classes
8.2.1. Injecting dependencies
8.3. Testing the commands
8.4. Refactoring the commands
8.4.1. Extracting common code
8.4.2. Reorganising the add command
9. Status report
9.1. Untracked files
9.1.1. Untracked files not in the index
9.1.2. Untracked directories
9.1.3. Empty untracked directories
9.2. Index/workspace differences
9.2.1. Changed contents
9.2.2. Changed mode
9.2.3. Size-preserving changes
9.2.4. Timestamp optimisation
9.2.5. Deleted files
10. The next commit
10.1. Reading from the database
10.1.1. Parsing blobs
10.1.2. Parsing commits
10.1.3. Parsing trees
10.1.4. Listing the files in a commit
10.2. HEAD/index differences
10.2.1. Added files
10.2.2. Modified files
10.2.3. Deleted files
10.3. The long format
10.3.1. Making the change easy
10.3.2. Making the easy change
10.3.3. Orderly change
10.4. Printing in colour
11. The Myers diff algorithm
11.1. What’s in a diff?
11.2. Time for some graph theory
11.2.1. Walking the graph
11.2.2. A change of perspective
11.2.3. Implementing the shortest-edit search
11.3. Retracing our steps
11.3.1. Recording the search
11.3.2. And you may ask yourself, how did I get here?
12. Spot the difference
12.1. Reusing status
12.2. Just the headlines
12.2.1. Unstaged changes
12.2.2. A common pattern
12.2.3. Staged changes
12.3. Displaying edits
12.3.1. Splitting edits into hunks
12.3.2. Displaying diffs in colour
12.3.3. Invoking the pager
Part II. Branching and merging
13. Branching out
13.1. Examining the branch command
13.2. Creating a branch
13.3. Setting the start point
13.3.1. Parsing revisions
13.3.2. Interpreting the AST
13.3.3. Revisions and object IDs
14. Migrating between trees
14.1. Telling trees apart
14.2. Planning the changes
14.3. Updating the workspace
14.4. Updating the index
14.5. Preventing conflicts
14.5.1. Single-file status checks
14.5.2. Checking the migration for conflicts
14.5.3. Reporting conflicts
14.6. The perils of self-hosting
15. Switching branches
15.1. Symbolic references
15.1.1. Tracking branch pointers
15.1.2. Detached HEAD
15.1.3. Retaining detached histories
15.2. Linking HEAD on checkout
15.2.1. Reading symbolic references
15.3. Printing checkout results
15.4. Updating HEAD on commit
15.4.1. The master branch
15.5. Branch management
15.5.1. Parsing command-line options
15.5.2. Listing branches
15.5.3. Deleting branches
16. Reviewing history
16.1. Linear history
16.1.1. Medium format
16.1.2. Abbreviated commit IDs
16.1.3. One-line format
16.1.4. Branch decoration
16.1.5. Displaying patches
16.2. Branching histories
16.2.1. Revision lists
16.2.2. Logging multiple branches
16.2.3. Excluding branches
16.2.4. Filtering by changed paths
17. Basic merging
17.1. What is a merge?
17.1.1. Merging single commits
17.1.2. Merging a chain of commits
17.1.3. Interpreting merges
17.2. Finding the best common ancestor
17.3. Commits with multiple parents
17.4. Performing a merge
17.5. Best common ancestors with merges
17.6. Logs in a merging history
17.6.1. Following all commit parents
17.6.2. Hiding patches for merge commits
17.6.3. Pruning treesame commits
17.6.4. Following only treesame parents
17.7. Revisions with multiple parents
18. When merges fail
18.1. A little refactoring
18.2. Null and fast-forward merges
18.2.1. Merging an existing ancestor
18.2.2. Fast-forward merge
18.3. Conflicted index entries
18.3.1. Inspecting the conflicted repository
18.3.2. Stages in the index
18.3.3. Storing entries by stage
18.3.4. Storing conflicts
18.4. Conflict detection
18.4.1. Concurrency, causality and locks
18.4.2. Add/edit/delete conflicts
18.4.3. File/directory conflicts
19. Conflict resolution
19.1. Printing conflict warnings
19.2. Conflicted status
19.2.1. Long status format
19.2.2. Porcelain status format
19.3. Conflicted diffs
19.3.1. Unmerged paths
19.3.2. Selecting stages
19.4. Resuming a merge
19.4.1. Resolving conflicts in the index
19.4.2. Retaining state across commands
19.4.3. Writing a merge commit
20. Merging inside files
20.1. The diff3 algorithm
20.1.1. Worked example
20.1.2. Implementing diff3
20.1.3. Using diff3 during a merge
20.2. Logging merge commits
20.2.1. Unifying hunks
20.2.2. Diffs during merge conflicts
20.2.3. Diffs for merge commits
21. Correcting mistakes
21.1. Removing files from the index
21.1.1. Preventing data loss
21.1.2. Refinements to the rm command
21.2. Resetting the index state
21.2.1. Resetting to a different commit
21.3. Discarding commits from your branch
21.3.1. Hard reset
21.3.2. I’m losing my HEAD
21.4. Escaping from merges
22. Editing messages
22.1. Setting the commit message
22.2. Composing the commit message
22.2.1. Launching the editor
22.2.2. Starting and resuming merges
22.3. Reusing messages
22.3.1. Amending the HEAD
22.3.2. Recording the committer
23. Cherry-picking
23.1. Cherry-picking a single commit
23.1.1. New types of pending commit
23.1.2. Resuming from conflicts
23.2. Multiple commits and ranges
23.2.1. Rev-list without walking
23.2.2. Conflicts during ranges
23.2.3. When all else fails
24. Reshaping history
24.1. Changing old commits
24.1.1. Amending an old commit
24.1.2. Reordering commits
24.2. Rebase
24.2.1. Rebase onto a different branch
24.2.2. Interactive rebase
24.3. Reverting existing commits
24.3.1. Cherry-pick in reverse
24.3.2. Sequencing infrastructure
24.3.3. The revert command
24.3.4. Pending commit status
24.3.5. Reverting merge commits
24.4. Stashing changes
Part III. Distribution
25. Configuration
25.1. The Git config format
25.1.1. Whitespace and comments
25.1.2. Abstract and concrete representation
25.2. Modelling the .git/config file
25.2.1. Parsing the configuration
25.2.2. Manipulating the settings
25.2.3. The configuration stack
25.3. Applications
25.3.1. Launching the editor
25.3.2. Setting user details
25.3.3. Changing diff formatting
25.3.4. Cherry-picking merge commits
26. Remote repositories
26.1. Storing remote references
26.2. The remote command
26.2.1. Adding a remote
26.2.2. Removing a remote
26.2.3. Listing remotes
26.3. Refspecs
26.4. Finding objects
27. The network protocol
27.1. Programs as ad-hoc servers
27.2. Remote agents
27.3. The packet-line protocol
27.4. The pack format
27.4.1. Writing packs
27.4.2. Reading from packs
27.4.3. Reading from a stream
28. Fetching content
28.1. Pack negotiation
28.1.1. Non-fast-forward updates
28.2. The fetch and upload-pack commands
28.2.1. Connecting to the remote
28.2.2. Transferring references
28.2.3. Negotiating the pack
28.2.4. Sending object packs
28.2.5. Updating remote refs
28.2.6. Connecting to remote repositories
28.3. Clone and pull
28.3.1. Pulling and rebasing
28.3.2. Historic disagreement
29. Pushing changes
29.1. Shorthand refspecs
29.2. The push and receive-pack commands
29.2.1. Sending update requests
29.2.2. Updating remote refs
29.2.3. Validating update requests
29.3. Progress meters
30. Delta compression
30.1. The XDelta algorithm
30.1.1. Comparison with diffs
30.1.2. Implementation
30.2. Delta encoding
30.3. Expanding deltas
31. Compressing packs
31.1. Finding similar objects
31.1.1. Generating object paths
31.1.2. Sorting packed objects
31.2. Forming delta pairs
31.2.1. Sliding-window compression
31.2.2. Limiting delta chain length
31.3. Writing and reading deltas
32. Packs in the database
32.1. Indexing packs
32.1.1. Extracting TempFile
32.1.2. Processing the incoming pack
32.1.3. Generating the index
32.1.4. Reconstructing objects
32.1.5. Storing the index
32.2. A new database backend
32.2.1. Reading the pack index
32.2.2. Replacing the backend
32.3. Offset deltas
33. Working with remote branches
33.1. Remote-tracking branches
33.1.1. Logging remote branches
33.1.2. Listing remote branches
33.2. Upstream branches
33.2.1. Setting an upstream branch
33.2.2. Safely deleting branches
33.2.3. Upstream branch divergence
33.2.4. The @{upstream} revision
33.2.5. Fetching and pushing upstream
34. …and everything else
Part IV. Appendices
Appendix A. Programming in Ruby
A.1. Installation
A.2. Core language
A.2.1. Control flow
A.2.2. Error handling
A.2.3. Objects, classes, and methods
A.2.4. Blocks
A.2.5. Constants
A.3. Built-in data types
A.3.1. true, false and nil
A.3.2. Integer
A.3.3. String
A.3.4. Regexp
A.3.5. Symbol
A.3.6. Array
A.3.7. Range
A.3.8. Hash
A.3.9. Struct
A.4. Mixins
A.4.1. Enumerable
A.4.2. Comparable
A.5. Libraries
A.5.1. Digest
A.5.2. FileUtils
A.5.3. Forwardable
A.5.4. Open3
A.5.5. OptionParser
A.5.6. Pathname
A.5.7. Set
A.5.8. Shellwords
A.5.9. StringIO
A.5.10. StringScanner
A.5.11. Time
A.5.12. URI
A.5.13. Zlib
Appendix B. Bitwise arithmetic